package com.h3c.nem.service;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.eos.common.constant.StatusCodeEnum;
import com.eos.common.custom.BusinessException;
import com.eos.common.domain.ActiveUser;
import com.eos.common.util.CustomBeanUtils;
import com.eos.common.util.DateUtils;
import com.eos.common.util.IdWorker;
import com.eos.common.util.UserUtils;
import com.github.pagehelper.PageHelper;
import com.h3c.nem.client.*;
import com.h3c.nem.config.SpringUtil;
import com.h3c.nem.config.TopicRabbitConfig;
import com.h3c.nem.dto.*;
import com.h3c.nem.dto.beisen.PtEnumDTO;
import com.h3c.nem.dto.enums.UserRoleEnum;
import com.h3c.nem.entity.*;
import com.h3c.nem.enums.AutoOpTypeEnum;
import com.h3c.nem.enums.FileOpTypeEnum;
import com.h3c.nem.enums.OfferWorkerFillStageEnum;
import com.h3c.nem.mapper.*;
import com.h3c.nem.mapstruct.TbOfferWorkerMapstruct;
import com.h3c.nem.sap.RfcManager;
import com.h3c.nem.service.impl.SdDeptServiceImpl;
import com.h3c.nem.utils.*;
import com.h3c.nem.vo.TbOfferWorkerVO;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoTable;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jsoup.Jsoup;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.*;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.io.*;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Service
@Slf4j
@Transactional
public class CommService {

    @Resource
    private ThreadPoolService threadPoolService;

    @Value("${pm.outer_appname}")
    private String outerAppName;

    @Value("${pm.outer_apppwd}")
    private String outerAppPasswd;

    @Autowired
    BeiSenService beiSenService;

    @Value("${hrssfile.prefixurl}")
    private String hrssFilePrefixUrl;

    @Autowired
    DataImageClient dataImageClient;

    @Resource
    OfferSendDetailMapper offerSendDetailMapper;

    @Resource
    OfferEmployeeinfoMapper offerEmployeeinfoMapper;

    @Resource
    OfferSocialsecurityaddressMapper offerSocialsecurityaddressMapper;

    @Resource
    OfferAttachmentfilesMapper offerAttachmentfilesMapper;

    @Resource
    TbOfferWorkerMapper tbOfferWorkerMapper;

    @Resource
    TbOfferStudyMapper tbOfferStudyMapper;

    @Resource
    TbOfferLanguageMapper tbOfferLanguageMapper;

    @Resource
    TbOfferFamilyMapper tbOfferFamilyMapper;

    @Resource
    TbOfferContactorMapper tbOfferContactorMapper;

    @Resource
    TbOfferPatentMapper tbOfferPatentMapper;

    @Resource
    TbOfferArchieveMapper tbOfferArchieveMapper;

    @Resource
    TbWorkerExperienceMapper tbWorkerExperienceMapper;

    @Resource
    OfferStudyinfoMapper offerStudyinfoMapper;
    @Resource
    OfferLanguageinfoMapper offerLanguageinfoMapper;
    @Resource
    OfferWorkinfoMapper offerWorkinfoMapper;
    @Resource
    OfferPatentsMapper offerPatentsMapper;
    @Resource
    OfferArchievementsMapper offerArchievementsMapper;
    @Resource
    OfferFamilymemberinfoMapper offerFamilymemberinfoMapper;
    @Resource
    OfferContactsinfoMapper offerContactsinfoMapper;

    @Resource
    SdAllWorkerMapper sdAllWorkerMapper;

    @Resource
    TbWorkerMapper tbWorkerMapper;

    @Resource
    SdNoticeRecordMapper sdNoticeRecordMapper;

    @Autowired
    ManuTranscationService manuTranscationService;

    @Autowired
    ISdFileTemplateService iSdFileTemplateService;

    @Autowired
    FileOperateService fileOperateService;

    @Resource
    SdDeptMapper sdDeptMapper;
    @Resource
    TbTeacherMapper tbTeacherMapper;

    @Autowired
    UserUtils userUtils;

    @Autowired
    UserFeignClient userFeignClient;

    @Autowired
    EosMessageClient eosMessageClient;

    @Resource
    SdUploadFileMapper sdUploadFileMapper;

    @Autowired
    SdDeptServiceImpl sdDeptServiceImpl;

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    SfsFeignClient sfsFeignClient;

    @Resource
    private RfcManager rfcManager;

    @Autowired
    SapClient sapClient;

    @Autowired
    AbilityClient abilityClient;

    @Autowired
    EosSyncDataClient eosSyncDataClient;

    @Autowired
    DataCenterFeignClient dataCenterFeignClient;

    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private TopicRabbitConfig topicRabbitConfig;

    @Resource
    private WeChatUtils weChatUtils;

    private static final String deptRedis = "nem:dept:";

    @Resource
    SdUserMapper sdUserMapper;

    @Value("${spring.application.name}")
    private String appAccount;

    @Value("${spring.application.password}")
    private String appPwd;

    @Value("${eos.nem.account}")
    private String eosNemAccount;

    @Value("${eos.nem.password}")
    private String eosNemPassword;

    @Value("${eos.msg.token.url}")
    private String eosMsgTokenUrl;

    @Value("${eos.msg.send.url}")
    private String eosMsgSendUrl;

    @Value("${inventory.account}")
    private String inventoryAccount;

    @Value("${inventory.password}")
    private String inventoryPassword;

    //因为要使用绩效的中台账户查询绩效相关信息，所以需要使用绩效的中台账户
    @Value("${performance.manage.account}")
    private String performanceAccount;

    @Value("${performance.manage.password}")
    private String performancePassword;

    @Value("${busi.adminids}")
    private String adminDomainAccounts;

    @Value("${sfs.appId}")
    private String appId;

    @Value("${sfs.pwd}")
    private String pwd;

    @Value("${sfs.path}")
    private String path;

    @Value("${sfs.parentFileSid}")
    private String parentFileSid;

    @Value("${sfs.url}")
    private String url;

    @Value("${sfs.adminDomainAccount}")
    private String adminAccount;

    @Value("${eos.account}")
    private String hrsscEosMidAccount;

    @Value("${eos.password}")
    private String hrsscEosMidPassword;

    @Value("${eos.dept.account}")
    private String deptEosAccount;

    @Value("${eos.dept.password}")
    private String deptEosPassword;

    @Value("${sso.key}")
    private String ssoKey;

    @Value("${busi.rsa.privatekey}")
    private String pmPrivatekey;

    @Value("${jwt.config.ttl}")
    private Long keyTtl;

    @Value("${mail.send.flag}")
    private String mailSendFlag;

    @Resource
    private ValueOperations<String, Object> valueOperations;

    @Value("${system.runMode}")
    private String runMode;

    @Value("${pm.syncSAP.appid}")
    private String sapAppId;

    @Value("${pm.syncSAP.appsecret}")
    private String sapAppSecret;

    @Value("${ptability.token}")
    private String ptToken;

    @Value("${wechat.agentId}")
    private String agentId;

    /**
     * 将文件转换成byte数组
     *
     * @param file
     * @return
     */
    public static byte[] file2Byte(File file) {
        byte[] buffer = null;
        try {
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }

    //使用ConcurrentHashMap，避免多线程入值时数据丢失
    public static Map<String, Object> dataCacheMap = new ConcurrentHashMap<>();

    public void initData() throws Exception {
        //初始化相关数据到Redis缓存

        //初始化部门数据
        initDeptData();
//        refreshDeptRedis();
        initCountryData();
        new Thread(() -> {
            List<SdAllWorker> allWorkers = sdAllWorkerMapper.selectList(new QueryWrapper<>());
            if (allWorkers != null) {
                allWorkers.forEach(worker -> {
                    dataCacheMap.put("allworker-" + worker.getWorkerId(), worker);
                    dataCacheMap.put("domain-" + worker.getDomainAccount(), worker);
                });
            }
        }).start();
    }

    public SdAllWorker getAllWorkerDoFromLocalCache(String workerId) {
        SdAllWorker allWorker = (SdAllWorker) dataCacheMap.get("allworker-" + workerId);
        log.info(workerId + "...............................缓存获取................................");
        if (allWorker == null) {
            allWorker = sdAllWorkerMapper.selectOne(new QueryWrapper<SdAllWorker>().lambda().eq(SdAllWorker::getWorkerId, workerId));
            addAllWorkerDoToLocalCache(workerId, allWorker);
            log.info(workerId + "...............................数据库获取................................");
        }
        return allWorker;
    }

    public SdAllWorker addAllWorkerDoToLocalCache(String workerId, SdAllWorker allWorker) {
        if (allWorker == null) {
            return null;
        }
        return (SdAllWorker) dataCacheMap.put("allworker-" + workerId, allWorker);
    }

    public SdAllWorker getWorkerIdByDomain(String domainAccount) {
        SdAllWorker allWorker = (SdAllWorker) dataCacheMap.get("domain-" + domainAccount.toLowerCase());
        if (allWorker == null) {
            allWorker = sdAllWorkerMapper.selectOne(new QueryWrapper<SdAllWorker>().lambda().eq(SdAllWorker::getDomainAccount, domainAccount.toLowerCase()));
            dataCacheMap.put("domain-" +  domainAccount.toLowerCase(), allWorker);
        }
        return allWorker;
    }

    public void initCountryData() {
        PtEnumDTO enumDTO = new PtEnumDTO();
        enumDTO.setAppId("nem-manager");
        enumDTO.setEnumCode("NEW_STAFF_NATIONALITY");
        JSONObject ptEnumRes = abilityClient.getPtEnum(enumDTO, ptToken);
        List<PtEnumDTO> ptEnum = JSONObject.parseArray(JSONObject.toJSONString(ptEnumRes.get("data")), PtEnumDTO.class);
        //<国籍，编码>
        ptEnum.forEach(e -> {
            dataCacheMap.put("country-" + e.getNameZh(), e.getValue());
            dataCacheMap.put("country-" + e.getValue(), e.getNameZh());
        });
    }

    public void initDeptData() {
        //初始化部门数据
        List<SdDept> deptList = sdDeptMapper.selectList(null);
        if (deptList != null) {
            deptList.forEach(dept -> dataCacheMap.put("dept-" + dept.getDeptId(), dept));
        }
    }

    public String getCountry(String codeOrName) {
        Object o = dataCacheMap.get("country-" + codeOrName);
        if (o != null) {
            return (String) o;
        } else {
            return "";
        }
    }

    public String getCache(String key) {
        Object o = dataCacheMap.get(key);
        if (o != null) {
            return JSONObject.toJSONString(o);
        } else  {
            return "";
        }
    }

    public SdDept getDept(Integer deptId) {
        Object o = dataCacheMap.get("dept-" + deptId);
        if (o != null) {
            return (SdDept) o;
        } else {
            SdDept sdDept = sdDeptMapper.selectById(deptId);
            if (sdDept != null) {
                return sdDept;
            } else {
                return null;
            }
        }
    }

    public String getDeptName(Integer deptId) {
        if (deptId == null) {
            return "";
        }
        SdDept dept = getDept(deptId);
        return dept == null ? "" : dept.getDeptName();
    }

//    public static void main(String[] args) {
//        String str = "yyyyMMdd";
//        SimpleDateFormat sdf = new SimpleDateFormat(str);
//        sdf.setLenient(false);
//        try {
//            System.out.println(sdf.parse("2021101"));
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//    }

    public void noticeAdmins(String emailTitle, String emailContent) {
        List<SdNoticeRecord> emailList = new ArrayList<>();
        if (!StringUtils.isEmpty(adminDomainAccounts)) {
            for (String adminDomainAccount : adminDomainAccounts.split(",")) {
                Object userObj = dataCacheMap.get(BusiEnumDefine.DOMAIN_ACCT_PREFIX + adminDomainAccount);
                if (userObj != null) {
                    LoginUserDTO dto = (LoginUserDTO) userObj;
                    SdNoticeRecord emailRecord = new SdNoticeRecord();
                    emailRecord.setApplyUserId("-1");
                    emailRecord.setNoticeType(BusiEnumDefine.NOTICE_TYPE_EMAIL);
                    emailRecord.setNoticeTitle(emailTitle);
                    emailRecord.setNoticeContent(emailContent);
                    emailRecord.setCreateTime(new Date());
                    emailRecord.setNoticeId(IdWorker.nextId() + "");
                    emailRecord.setTargetEmail(dto.getEmail());
                    emailList.add(emailRecord);
                }

            }
            sendMessage(emailList);
        }
    }

    public String getReidsValue(String key) {
        return (String) valueOperations.get(key);
    }

    public void deleteRedisKey(String key) {
        redisTemplate.delete(key);
    }

    public void setReidsValue(String key, String value) {
        valueOperations.set(key, value);
    }

    public void setReidsValue(String key, String value, long seconds) {
        valueOperations.set(key, value, seconds, TimeUnit.SECONDS);
    }

    public LoginUserDTO getLoginUserDTO() {
        ActiveUser activeUser = CommonUtil.userHolder.get();
        if (activeUser != null) {
            String areaWorkId = activeUser.getUserId();
            if (StringUtils.isEmpty(areaWorkId)) {
                throw new BusinessException(StatusCodeEnum.UN_AUTH);
            }
            LoginUserDTO loginUserDTO = (LoginUserDTO) dataCacheMap.get(BusiEnumDefine.DOMAIN_ACCT_PREFIX + areaWorkId);
            if (loginUserDTO == null) {
                return getUserObjByAccountId(areaWorkId);
            }
            return loginUserDTO;
        }
        throw new BusinessException(StatusCodeEnum.UN_AUTH);
    }

    /**
     * 获取登录人工号
     *
     * @return
     */
    public String getLoginUserId() {
        return getLoginUserDTO().getUserId();
    }

    /**
     * 获取登录人ID/name
     *
     * @return
     */
    public String getLoginUserIdAndName() {
        LoginUserDTO loginUserDTO = getLoginUserDTO();
        return loginUserDTO.getUserId() + "/" + loginUserDTO.getUserName();
    }

    /**
     * 获取登录人name/ID
     *
     * @return
     */
    public String getLoginUserNameAndId() {
        LoginUserDTO loginUserDTO = getLoginUserDTO();
        return loginUserDTO.getUserName() + "/" + loginUserDTO.getUserId();
    }

    public String getLoginUserIdWithNoException() {
        ActiveUser activeUser = CommonUtil.userHolder.get();
        if (activeUser != null) {
            String areaWorkId = activeUser.getUserId();
            if (StringUtils.isEmpty(areaWorkId)) {
                return "";
            }
            LoginUserDTO loginUserDTO = (LoginUserDTO) dataCacheMap.get(BusiEnumDefine.DOMAIN_ACCT_PREFIX + areaWorkId);
            if (loginUserDTO != null) {
                return loginUserDTO.getUserId();
            } else {
                if (areaWorkId.startsWith("app-")) {
                    return areaWorkId;
                }
            }
        }
        return "";
    }

    public String getLoginUserNameWithNoException() {
        ActiveUser activeUser = CommonUtil.userHolder.get();
        if (activeUser != null) {
            String areaWorkId = activeUser.getUserId();
            LoginUserDTO loginUserDTO = (LoginUserDTO) dataCacheMap.get(BusiEnumDefine.DOMAIN_ACCT_PREFIX + areaWorkId);
            if (loginUserDTO != null) {
                return loginUserDTO.getUserName();
            }
        }
        return "";
    }

    /**
     * 获取登录人角色
     *
     * @return
     */
    public String getLoginUserRole() {
        LoginUserDTO loginUserDTO = getLoginUserDTO();
        return loginUserDTO.getUserRole();
    }

    /**
     * 判断该用户是否有某种权限
     *
     * @param waitCheckRole
     * @return
     */
    public boolean checkLoginUserRole(@NotNull Integer waitCheckRole) {
        String[] role = getLoginUserRole().split(",");
        for (String s : role) {
            if (waitCheckRole.toString().equals(s)) {
                return true;
            }
        }
        return false;
    }
    /**
     * 判断该用户是否是bp
     *
     * @return
     */
    public boolean checkLoginUserBP() {
        String[] role = getLoginUserRole().split(",");
        for (String s : role) {
            if (String.valueOf(BusiEnumDefine.USER_ROLE_BP).equals(s)
                    ||String.valueOf(BusiEnumDefine.USER_ROLE_NEW_WORKER_BP).equals(s)
                    ||String.valueOf(BusiEnumDefine.USER_ROLE_OFFER_BP).equals(s)
                    ||String.valueOf(BusiEnumDefine.USER_ROLE_DEPT1BP).equals(s)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断该用户是否只有某种权限
     *
     * @param waitCheckRole
     * @return
     */
    public boolean checkLoginUserOnlyRole(@NotNull Integer waitCheckRole) {
        String[] role = getLoginUserRole().split(",");
        String[] realRole = Arrays.stream(role).filter(s -> !"".equals(s)).toArray(String[]::new);
        if (realRole.length > 1) {
            return false;
        }
        for (String s : realRole) {
            if (waitCheckRole.toString().equals(s)) {
                return true;
            }
        }
        return false;
    }

    public String getEosToken() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("account", hrsscEosMidAccount);
        jsonObject.put("password", hrsscEosMidPassword);
        JSONObject eosToken = eosSyncDataClient.getEosToken(jsonObject.toJSONString());
        Integer code = (Integer) eosToken.get("code");
        if (20220 == code) {
            LinkedHashMap<String, Object> object = (LinkedHashMap) eosToken.get("data");
            return (String) object.get("token");
        } else {
            throw new AppBusinessException("获取eosToken失败");
        }
    }

    public String getEosDeptToken() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("account", deptEosAccount);
        jsonObject.put("password", deptEosPassword);
        JSONObject eosToken = eosSyncDataClient.getEosToken(jsonObject.toJSONString());
        Integer code = (Integer) eosToken.get("code");
        if (20220 == code) {
            LinkedHashMap<String, Object> object = (LinkedHashMap) eosToken.get("data");
            return (String) object.get("token");
        } else {
            throw new AppBusinessException("获取eosToken失败");
        }
    }

    public String getAppToken() {
        return "Bearer " + userUtils.getToken(appAccount, appPwd);
    }

    public String getPerformanceToken() {
        return "Bearer " + userUtils.getToken(performanceAccount, performancePassword);
    }

    public String getInventoryToken() {
        return "Bearer " + userUtils.getToken(inventoryAccount, inventoryPassword);
    }

    public String getSscAppToken() {
        return "Bearer " + userUtils.getToken(hrsscEosMidAccount, hrsscEosMidPassword);
    }

    /**
     * 根据域账号获取用户工号
     *
     * @param userDomainAccount 域账号
     * @return
     */
    public LoginUserDTO getUserObjByAccountId(String userDomainAccount) {
        if (StringUtils.isEmpty(userDomainAccount)) {
            throw new BusinessException(StatusCodeEnum.UN_AUTH);
        }
        LoginUserDTO loginUserDTO = (LoginUserDTO) dataCacheMap.get(BusiEnumDefine.DOMAIN_ACCT_PREFIX + userDomainAccount);
        if (loginUserDTO != null) {
            //如果是系统用户，直接返回即可
            return loginUserDTO;
        }

        String userId = "";
        LoginUserDTO dto = new LoginUserDTO();
        dto.setMode(runMode);
        //test模式：服务启动后第一次进入系统，检查是否存用户切换
        if (runMode.equals(BusiEnumDefine.SYSTEM_RUN_MODE_TEST)) {
            QueryWrapper<SdAllWorker> fileWrapper = Wrappers.query();
            fileWrapper.eq("domain_account", userDomainAccount);
            //检查allworker的lockAccount是否设置了模拟的其他人
            SdAllWorker loginWorker = sdAllWorkerMapper.selectOne(fileWrapper);
            if (loginWorker != null) {
                String lockAccount = loginWorker.getLockAccount();
                if (!StringUtils.isEmpty(lockAccount) && !lockAccount.equals("-1")) {
                    QueryWrapper<SdAllWorker> targetFileWrapper = Wrappers.query();
                    targetFileWrapper.eq("domain_account", lockAccount);
                    SdAllWorker lockWorker = sdAllWorkerMapper.selectOne(targetFileWrapper);
                    //将userId改为模拟员工的工号, 登录人的域账号仍然保留实际登录人的域账号（如果测试待办功能，会使用域账号，这里会受到影响）
                    userId = lockWorker.getWorkerId();
                    dto.setAccount(userDomainAccount);
                    dto.setUserId(userId);
                    dto.setUserName(lockWorker.getWorkerName());
//                    dto.setPhoneNo(worker.getPhoneNo());
                    dto.setEmail(lockWorker.getEmail());
                } else {
                    dto.setAccount(userDomainAccount);
                    dto.setUserId(loginWorker.getWorkerId());
                    dto.setUserName(loginWorker.getWorkerName());
//                    dto.setPhoneNo(worker.getPhoneNo());
                    dto.setEmail(loginWorker.getEmail());
                }
            } else {
                throw new AppBusinessException("[域账号：" + userDomainAccount + "]用户不存在！");
            }
        }

        String systemUserRole = null;
        SdUser userDo = new SdUser();
        SdUser user = new SdUser();
        if (StringUtils.isEmpty(userId)) {
            user.setDomainAccount(userDomainAccount);
        } else {
            user.setUserId(userId);
        }
        List<SdUser> sdUsers = sdUserMapper.queryList(user);
        if (!CollectionUtils.isEmpty(sdUsers)) {
            userDo = sdUsers.get(0);
            userId = userDo.getUserId();
            systemUserRole = userDo.getUserRole();
            dto.setAccount(userDomainAccount);
            dto.setUserId(userId);
            dto.setUserName(userDo.getUserName());
            dto.setPhoneNo(userDo.getPhoneNo());
            dto.setEmail(userDo.getEmail());
        } else {
            if (runMode.equals(BusiEnumDefine.SYSTEM_RUN_MODE_PROD)) {
                //如果不是系统用户，则到中台查询他的基本信息
                JSONObject jsonObject = dataCenterFeignClient.queryLoginUserInfo("{\"domainAccount\":\"" + userDomainAccount + "\"}", getPerformanceToken());
                List<Map<String, String>> list = (List<Map<String, String>>) jsonObject.get("data");
                if (CollectionUtils.isEmpty(list)) {
                    throw new AppBusinessException("[域账号：" + userDomainAccount + "]用户不存在！");
                }
                userId = list.get(0).get("emp_code");
                String userName = list.get(0).get("emp_name");
                String email = list.get(0).get("email");
                if (!StringUtils.isEmpty(userId)) {
//                    String basicInfo = dataCenterFeignClient.queryWorkerBasicInfo("{\"empCode\":\"" + userId + "\"}", getEosToken());
//                    JSONObject basicInfoJson = JSONObject.parseObject(basicInfo);
//                    List<Map<String, String>> basicInfoList = (List<Map<String, String>>) basicInfoJson.get("data");
//                    if (CollectionUtils.isEmpty(basicInfoList)) {
//                        throw new AppBusinessException("[工号：" + userId + "]用户不存在！");
//                    }
                    //String phoneNo = basicInfoList.get(0).get("mobile");

                    dto.setAccount(userDomainAccount);
                    dto.setUserId(userId);
                    dto.setUserName(userName);
                    //dto.setPhoneNo(phoneNo);
                    dto.setEmail(email);
                } else {
                    throw new BusinessException(StatusCodeEnum.UN_AUTH);
                }
            } else {
                userId = sdAllWorkerMapper.selectWorkerIdByDomain(userDomainAccount);
            }
        }

        StringBuilder userRoleSb = new StringBuilder(",");
        boolean hasRoleFlag = false;
//        Integer checkResult = tbFlowInstMapper.checkApprover(userId);
//        if (checkResult != null && checkResult.intValue() == 1) {
//            userRoleSb.append(BusiEnumDefine.USER_ROLE_APPROVER).append(",");
//            hasRoleFlag = true;
//        }

        //String authDeptS = (String) redisTemplate.opsForValue().get(deptRedis +userId);
        if (!StringUtils.isEmpty(userId)) {
            Integer deptManagerCheckResult = sdDeptMapper.checkDeptManager(userId);
            if (deptManagerCheckResult != null && deptManagerCheckResult.intValue() == 1) {
                userRoleSb.append(BusiEnumDefine.USER_ROLE_DEPT_MANAGER).append(",");
                hasRoleFlag = true;
            }

            // List<TbWorker> tbWorkerList = tbWorkerMapper.selectList(new QueryWrapper<TbWorker>().like("direct_manager",userId));
            Integer checkDirect = tbWorkerMapper.checkDirectManager(userId);
            if (checkDirect != null && checkDirect.intValue() == 1) {
                userRoleSb.append(BusiEnumDefine.USER_ROLE_DIRECT_MANAGER).append(",");
                hasRoleFlag = true;
            }

            Integer checkWorkerResult = tbWorkerMapper.checkNewWorker(userId);
            if (checkWorkerResult != null && checkWorkerResult.intValue() == 1) {
                userRoleSb.append(BusiEnumDefine.USER_ROLE_WORKER).append(",");
                hasRoleFlag = true;
            }
            //一级部门BP
            Integer checkDept1Bp =  sdDeptMapper.checkDept1Bp(userId,1);
            if(checkDept1Bp != null && checkDept1Bp.intValue() == 1){
                userRoleSb.append(BusiEnumDefine.USER_ROLE_DEPT1BP).append(",");
                dto.setDept1Bp(1);
                hasRoleFlag = true;
            }else {
                dto.setDept1Bp(2);
            }
            //是否是导师
            Integer checkIsTeacher = tbTeacherMapper.checkIsTeacher(userId);
            if(checkIsTeacher != null && checkIsTeacher.intValue() == 1){
                userRoleSb.append(BusiEnumDefine.USER_ROLE_TEACHER).append(",");
                dto.setIsTeacher(1);
                hasRoleFlag = true;
            }else {
                dto.setIsTeacher(2);
            }
        }

        if (systemUserRole != null) {
            userRoleSb.append(systemUserRole.toString()).append(",");
            hasRoleFlag = true;
            //是bp,接口人或gbbz时，检验管理导师的权限
            for (String role : systemUserRole.split(",")) {
                Integer intRole = Integer.valueOf(role);
                if (intRole == BusiEnumDefine.USER_ROLE_BP || intRole == BusiEnumDefine.USER_ROLE_DEPT_CONTACTOR
                        || intRole == BusiEnumDefine.USER_ROLE_GBBZ||intRole ==BusiEnumDefine.USER_ROLE_NEW_WORKER_BP){
                    Integer teacherFlag = sdUsers.get(0).getTeacherFlag();
                    if (teacherFlag != null && teacherFlag == 1) {
                        userRoleSb.append(BusiEnumDefine.USER_ROLE_TEACHER_MANAGER).append(",");
                    }
                }

                if (intRole == BusiEnumDefine.USER_ROLE_NEW_WORKER_BP || intRole == BusiEnumDefine.USER_ROLE_OFFER_BP) {
                    Integer canSendOffer = sdUsers.get(0).getCanSendOffer();
                    if (canSendOffer != null && canSendOffer == 1) {
                        userRoleSb.append(BusiEnumDefine.USER_ROLE_SEND_OFFER).append(",");
                        dto.setCanSendFlag(sdUsers.get(0).getCanSendOffer());
                    }
                }
                if (intRole == BusiEnumDefine.USER_ROLE_NEW_WORKER_BP){
                    userRoleSb.append(BusiEnumDefine.USER_ROLE_BP).append(",");
                }
                if (intRole == BusiEnumDefine.USER_ROLE_NEW_WORKER_BP ){
                    userRoleSb.append(BusiEnumDefine.USER_ROLE_BP).append(",");
                }
            }
        }
        String userRole = userRoleSb.toString();
//        if (StringUtils.isEmpty(userRole) || !hasRoleFlag) {
//            throw new BusinessException(StatusCodeEnum.UN_AUTH);
//        }
        dto.setUserRole(userRole);
        if(userRole.split(",").length>0) {
            dataCacheMap.put(BusiEnumDefine.DOMAIN_ACCT_PREFIX + userDomainAccount, dto);
        }
        return dto;
    }

    public void clearCacheData() {
        ActiveUser activeUser = CommonUtil.userHolder.get();
        if (activeUser != null) {
            String areaWorkId = activeUser.getUserId();
            if (StringUtils.isEmpty(areaWorkId)) {
                throw new BusinessException(StatusCodeEnum.UN_AUTH);
            }
            dataCacheMap.put(BusiEnumDefine.DOMAIN_ACCT_PREFIX + areaWorkId, null);
            return;
        }
        throw new BusinessException(StatusCodeEnum.UN_AUTH);
    }

    public void saveLoginHistory(String userId, String userName, String type, String clientIP) {
        SdOperLog requestLog = new SdOperLog();
        requestLog.setOperId(IdWorker.nextId() + "");
        requestLog.setAppId("nem-manager");
        requestLog.setOperUserId(userId == null ? "-1" : userId);
        requestLog.setOperUserName(userName);
        requestLog.setRequestUrl(type);
        requestLog.setRequestTime(new Date());
        requestLog.setRequestParam(" ");
        requestLog.setClientIp(clientIP);
        requestLog.setRequestResult(BusiEnumDefine.FLAG_YES);
        Message message = topicRabbitConfig.getMessage(JSONObject.toJSONString(requestLog));
        rabbitTemplate.convertAndSend(topicRabbitConfig.getExchange(), topicRabbitConfig.getOperLogQueue(), message);
    }

    public Map<String, Object> getToken(String ticket) throws Exception {
        //域账号验证
        String accountStr = SsoTicketDec.deSsoTicket(ticket, ssoKey);
        if (StringUtils.isEmpty(accountStr)) {
            throw new BusinessException(StatusCodeEnum.USERID_NOT_FIND);
        }
        accountStr = accountStr.toLowerCase();

        String token = PmJwtUtil.generateTokenExpire(accountStr, pmPrivatekey, keyTtl, new HashMap<>());

        Map<String, Object> map = new HashMap<>();
        map.put("token", token);
        LoginUserDTO loginUser = getUserObjByAccountId(accountStr);
        map.put("info", loginUser);
        Map<String, Object> param = new HashMap<>(2);
        param.put("account", loginUser.getAccount());
        String ptResult = abilityClient.getPtabilityTokenByAccount(JSONUtil.toJsonStr(param));
        if (StringUtils.hasText(ptResult) && JSONUtil.parseObj(ptResult).getBool("flag")) {
            map.put("ptToken", JSONUtil.parseObj(ptResult).getJSONObject("data").getStr("token"));
        }
        return map;
    }

    /**
     * 根据企业微信 code获取token
     *
     * @param weChatCode 企业微信 code
     * @return java.util.Map<java.lang.String, java.lang.Object>
     * @author z22968
     * @date 2022-06-16 18:25
     */
    public Map<String, Object> getTokenByWechatCode(String weChatCode) throws Exception {
        String domainAccount = weChatUtils.getDomainAccount(weChatCode);
        if (StringUtils.isEmpty(domainAccount)) {
            throw new AppBusinessException("企业微信获取用户域账号失败");
        }
        domainAccount = domainAccount.toLowerCase();
        String token = PmJwtUtil.generateTokenExpire(domainAccount, pmPrivatekey, keyTtl, new HashMap<>());
        Map<String, Object> map = new HashMap<>();
        map.put("token", token);
        LoginUserDTO loginUser = getUserObjByAccountId(domainAccount);
        map.put("info", loginUser);
        return map;
    }


    public String loginUrl(String url) throws Exception {
        return SsoTicketDec.requestTicket(url, ssoKey);
    }

    public LoginUserDTO queryLoginUserInfo() {
        return getLoginUserDTO();
    }


    public File generateExportFile(String downLoadFileName, String templateCode, List<Object> dataObjs) {
        Map<String, Object> returnMap = null;
        if (!StringUtils.isEmpty(templateCode)) {
            returnMap = iSdFileTemplateService.queryTemplate(templateCode);
        }

        try {
            byte[] fileBytes = Base64Utils.decodeFromString((String) returnMap.get("file"));
            Integer startRow = (Integer) returnMap.get("startRow");
            Integer startCol = (Integer) returnMap.get("startCol");
            Integer colSize = (Integer) returnMap.get("colSize");
            String fieldContent = (String) returnMap.get("fieldContent");
            String fileName = (String) returnMap.get("filename");
            String fileType = fileName.substring(fileName.lastIndexOf("."));
            startCol = startCol - 1;
            startRow = startRow - 1;
            Integer endCol = startCol + colSize;
            String timeStr = DateUtils.dateFormat(new Date(), "yyyyMMddHHmmss");
            String dataFileName1 = timeStr;
            String dataFileName2 = downLoadFileName + timeStr;

            File tempDir = new File("download/");
            if (tempDir.exists() && tempDir.isDirectory()) {
                File[] files = tempDir.listFiles();
                String timeStrNow = DateUtils.dateFormat(new Date(), "yyyyMMddHH");
                for (File file1 : files) {
                    String fileTime = DateUtils.dateFormat(new Date(file1.lastModified()), "yyyyMMddHH");
                    if ((Long.valueOf(timeStrNow) - Long.valueOf(fileTime) > 10)) {
                        file1.delete();
                    }
                }
            } else {
                tempDir.mkdirs();
            }

            File file = new File("download/" + dataFileName1 + fileType);
            log.debug("~~~~~~~~~~~~~~~~~~AbsolutePath = " + file.getAbsolutePath());
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            bos.write(fileBytes);
            bos.flush();
            bos.close();
            FileInputStream fis = new FileInputStream(file);
            Workbook wb;
            if (fileType.equals(".xlsx")) {
                wb = new XSSFWorkbook(fis);
            } else {
                wb = new HSSFWorkbook(fis);
            }

            CellStyle blackStyle = wb.createCellStyle();
            CellStyle titleStyle = wb.createCellStyle();

            DataFormat format = wb.createDataFormat();

            Font font1;
            Font font2;
            Sheet sheet1;
            if (wb instanceof XSSFWorkbook) {
                font1 = (XSSFFont) wb.createFont();
                font2 = (XSSFFont) wb.createFont();
                sheet1 = (XSSFSheet) wb.getSheet("比例分布");
            } else {
                font1 = (HSSFFont) wb.createFont();
                font2 = (HSSFFont) wb.createFont();
                sheet1 = (HSSFSheet) wb.getSheet("比例分布");
            }
            font1.setFontHeightInPoints((short) 8);
            font2.setFontHeightInPoints((short) 8);
            font1.setFontName("微软雅黑");//设置字体
            font2.setFontName("微软雅黑");//设置字体
            font2.setBold(true);
            if (sheet1 != null) {
                sheet1.setForceFormulaRecalculation(true);  //sheet内公式强制执行
            }
            blackStyle.setFont(font1);
            blackStyle.setBorderTop(BorderStyle.THIN);  //单元格加边框
            blackStyle.setBorderBottom(BorderStyle.THIN);
            blackStyle.setBorderLeft(BorderStyle.THIN);
            blackStyle.setBorderRight(BorderStyle.THIN);
            blackStyle.setTopBorderColor(IndexedColors.BLACK.index);
            blackStyle.setBottomBorderColor(IndexedColors.BLACK.index);
            blackStyle.setLeftBorderColor(IndexedColors.BLACK.index);
            blackStyle.setRightBorderColor(IndexedColors.BLACK.index);
//            blackStyle.setDataFormat(format.getFormat("0"));    //设置excel单元格格式为文本

            titleStyle.setBorderTop(BorderStyle.THIN);  //单元格加边框
            titleStyle.setBorderBottom(BorderStyle.THIN);
            titleStyle.setBorderLeft(BorderStyle.THIN);
            titleStyle.setBorderRight(BorderStyle.THIN);
            titleStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
            titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
            //设置填充背景色
            titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            titleStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
            titleStyle.setFont(font2);
//            blackStyle.setWrapText(true);

            //设置单元格宽度
            Sheet sheet = wb.getSheetAt(0);
//            sheet.setColumnWidth(0, 1000);

            File outFile = new File("download/" + dataFileName2 + fileType);
            FileOutputStream out = new FileOutputStream(outFile);
            String[] fields = fieldContent.split(";");
            Row row1 = sheet.getRow(startRow);
            Map<String, CellStyle> cellStyleMap = new HashMap<>();
            for (int i = startCol; i < endCol; i++) {
                Cell cell = row1.getCell(i);
                cellStyleMap.put(String.valueOf(i), cell.getCellStyle());
            }
            for (int dataIndex = 0; dataIndex < dataObjs.size(); dataIndex++) {
                Object dataObj = dataObjs.get(dataIndex);
                JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(dataObj));

                Row row = sheet.createRow(startRow + dataIndex);
                int currentRow = startRow + dataIndex + 1;
                int fieldIndex = 0;
                for (int i = startCol; i < endCol; i++) {
                    if (!StringUtils.isEmpty(fields[fieldIndex])) {
                        Cell cell = row.createCell(i);
                        CellStyle s = cellStyleMap.get(String.valueOf(i));
                        cell.setCellStyle(s);
                        if (fields[fieldIndex].indexOf("F=") >= 0) { //兼容公式
                            String formula = fields[fieldIndex].replace("F=", "").replaceAll("\\{r}", String.valueOf(currentRow));
                            cell.setCellFormula(formula);
                        } else {
                            Object fieldObj = json.get(fields[fieldIndex]);
                            if (fieldObj instanceof Integer) {
                                cell.setCellValue((Integer) fieldObj);
                            } else if (fieldObj instanceof Long) {
                                cell.setCellValue((Long) fieldObj);
                            } else if (fieldObj instanceof BigDecimal) {
                                cell.setCellValue(((BigDecimal) fieldObj).doubleValue());
                            } else {
                                String cellValue = (String) fieldObj;
                                //需要设置动态表头的模板也需要处理内容
//                                    if(BusiEnumDefine.OUTPUT_WORKER_LIST.equals(templateCode)||BusiEnumDefine.OUTPUT_WORKER_ABROAD_LIST.equals(templateCode)){
//                                        if (!StringUtils.isEmpty(cellValue)
//                                                && (fields[fieldIndex].indexOf("kpi") >= 0 || fields[fieldIndex].indexOf("culture") >= 0 || fields[fieldIndex].indexOf("lastYearKpi") >= 0 || fields[fieldIndex].indexOf("lastYearCulture") >= 0)) { //处理绩效文化数据
//                                            cellValue = cellValue.substring(cellValue.indexOf(":") + 1);
//                                        }
//                                    }
                                cell.setCellValue(cellValue);
                            }
                        }
                    }
                    fieldIndex++;
                }
            }

            out.flush();
            wb.write(out);
            out.close();

            if (file.exists()) {
                file.delete();
            }
            recordFileOperationLog(fileName, outFile.length(), FileOpTypeEnum.EXPORT);
            return outFile;
        } catch (Exception e) {
            e.printStackTrace();
            throw new AppBusinessException("导出文件出错！");
        }
    }

    /**
     * 权限操作日志
     *
     * @param opTableName 操作表
     * @param opType      操作类型
     * @param dataJson    接口数据
     * @param remark      备注
     */
    public void recordAuthChangeLog(String opTableName, AutoOpTypeEnum opType, String dataJson, String remark) {
        SdAuthChgLogDTO dto = new SdAuthChgLogDTO();
        dto.setLogId(IdWorker.nextId() + "");
        dto.setAppId("nem-manager");
        dto.setOperUserId(getLoginUserId());
        dto.setOperUserName(getLoginUserDTO().getUserName());
        dto.setOperTime(new Date());
        dto.setOperTableName(opTableName);
        dto.setOperType(opType.getCode());
        dto.setDataJson(dataJson);
        dto.setRemark(remark);
        Message message = topicRabbitConfig.getMessage(JSONObject.toJSONString(dto));
        rabbitTemplate.convertAndSend(topicRabbitConfig.getExchange(), topicRabbitConfig.getAuthChgLogQueue(), message);
    }

//    commService.recordAuthChangeLog("test", AutoOpTypeEnum.ADD, "{\"type\":\"ADD\"}", "zheshiyigeceshi");

    /**
     * 文件操作日志
     *
     * @param fileName 文件名称
     * @param fileSize 文件大小 byte
     * @param opType   操作类型 IMPORT/EXPORT
     */
    public void recordFileOperationLog(String fileName, Long fileSize, FileOpTypeEnum opType) {
        String id = null;
        LoginUserDTO userDTO = null;
        try {
            id = getLoginUserId();
            userDTO = getLoginUserDTO();
        } catch (BusinessException e) {
            e.printStackTrace();
            id = "-1";
        }
        String userName = userDTO == null ? "" : userDTO.getUserName();
        SdFileOperLogDTO sdFileOperLogDTO = new SdFileOperLogDTO();
        sdFileOperLogDTO.setFileLogId(IdWorker.nextId() + "");
        sdFileOperLogDTO.setAppId("nem-manager");
        sdFileOperLogDTO.setFileName(fileName);
        sdFileOperLogDTO.setFileSize(new BigDecimal(fileSize));
        sdFileOperLogDTO.setOperType(opType.getCode());
        sdFileOperLogDTO.setOperUserId(id);
        sdFileOperLogDTO.setOperUserName(userName);
        sdFileOperLogDTO.setOperTime(new Date());
        Message message = topicRabbitConfig.getMessage(JSONObject.toJSONString(sdFileOperLogDTO));
        rabbitTemplate.convertAndSend(topicRabbitConfig.getExchange(), topicRabbitConfig.getFileOperLogQueue(), message);
    }

    public String parseExcelByTemplate(String templateCode, MultipartFile uploadFile) {
        recordFileOperationLog(uploadFile.getOriginalFilename(), uploadFile.getSize(), FileOpTypeEnum.IMPORT);
        return fileOperateService.parseUploadFile(templateCode, uploadFile);
    }

    public File downloadTest() {
        List userList = new ArrayList();
        for (int i = 0; i < 9; i++) {
            SdUser user = new SdUser();
            user.setUserId("100" + i);
            user.setUserName("测试1" + i);
            user.setUserRole(String.valueOf(i));
            user.setEmail("100" + i + "@h3c.com");
            user.setDomainAccount("t100" + i);
            userList.add(user);
        }
        return generateExportFile("系统用户表.xlsx", "USER_T1", userList);
    }


    public String getEosUserToken() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("account", appAccount);
        jsonObject.put("password", appPwd);
        String eosTokenObjStr = userFeignClient.getEosToken(jsonObject.toJSONString());
        JSONObject returnJsonObject = JSONObject.parseObject(eosTokenObjStr);
        Integer code = (Integer) returnJsonObject.get("code");
        if (code != null && code == 20220) {
            JSONObject dataObject = (JSONObject) returnJsonObject.get("data");
            return "Bearer " + (String) dataObject.get("token");
        } else {
            throw new AppBusinessException("短信发送鉴权失败；sms auth failed;");
        }
    }

    /**
     * 调eos直接发送短信
     *
     * @param targetPhone
     * @param noticeContent
     */
    public void callSendSms(String targetPhone, String noticeContent) {
        String eosUserToken = getEosUserToken();
        JSONArray phoneList = new JSONArray();
        phoneList.add(targetPhone);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msgType", BusiEnumDefine.EOS_MSG_TYPE_SMS);
        jsonObject.put("clientId", "hrssc");
        jsonObject.put("content", noticeContent);
        jsonObject.put("phoneList", phoneList);
        JSONObject sendResultJson = eosMessageClient.sendEosMessge(jsonObject.toJSONString(), eosUserToken);
        Integer code = (Integer) sendResultJson.get("code");
        String message = (String) sendResultJson.get("message");
        if (code != null && code == 1000) {
            log.debug("短信发送成功；targetPhone=" + targetPhone + ";noticeContent=" + noticeContent);
        } else {
            throw new AppBusinessException("短信发送失败：" + message + ";targetPhone=" + targetPhone + ";noticeContent=" + noticeContent);
        }
    }

    public void sendMessage(List<SdNoticeRecord> noticeList) {
        try {
            noticeList.forEach(this::sendMessage);
        } catch (Exception e) {
            log.error("message发送失败", e);
        }
    }

    public void sendMessage(SdNoticeRecord noticeDo) {
        sendMessage(noticeDo, null);
    }

    public void sendMessage(List<SdNoticeRecord> noticeList, File mailFile) {

        List<File> emailFileList = new ArrayList<>();
        emailFileList.add(mailFile);
        try {
            noticeList.forEach(noticeDo -> {
                sendMessage(noticeDo, emailFileList);
            });
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("message发送失败");
        }
    }

    public void sendMessage(List<SdNoticeRecord> noticeList, List<File> emailFileList) {
        try {
            noticeList.forEach(noticeDo -> {
                sendMessage(noticeDo, emailFileList);
            });
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("message发送失败");
        }
    }

    public void sendMessage(SdNoticeRecord sdNoticeRecord, List<File> emailFileList) {
        sendMessage(sdNoticeRecord, emailFileList, null);
    }

    public void sendMessage(SdNoticeRecord sdNoticeRecord, List<File> emailFileList, List<String> accountList) {
        int sendFlag = BusiEnumDefine.SEND_NO;
        sdNoticeRecord.setSendFlag(sendFlag);
        manuTranscationService.doSaveNoticeRecord(sdNoticeRecord);
        if (mailSendFlag.equals(BusiEnumDefine.NOTICE_MAIL_SEND_YES)) {
            Integer noticeType = sdNoticeRecord.getNoticeType();
            //发邮件
            if (noticeType == BusiEnumDefine.NOTICE_TYPE_EMAIL) {
                sendEosMail(sdNoticeRecord.getTargetEmail(), sdNoticeRecord.getCopyToEmail(),
                        sdNoticeRecord.getNoticeContent(), sdNoticeRecord.getNoticeTitle(), emailFileList);
            }
            //发短信
            else if (noticeType == BusiEnumDefine.NOTICE_TYPE_SMS) {
                String text = sdNoticeRecord.getNoticeContent();
                if (!StringUtils.isEmpty(text)) {
                    //去除HTML标签
                    text = Jsoup.parse(sdNoticeRecord.getNoticeContent()).text();
                }
                sendSmsMessage(sdNoticeRecord.getTargetPhone(), text);
            } else if (noticeType == BusiEnumDefine.NOTICE_TYPE_QW) {
                sendQwMessage(sdNoticeRecord.getNoticeContent(), accountList);
            }
            sendFlag = BusiEnumDefine.SEND_YES;
            sdNoticeRecord.setSendTime(new Date());
        }
        sdNoticeRecord.setSendFlag(sendFlag);
        sdNoticeRecordMapper.updateSdNoticeRecord(sdNoticeRecord);
    }

    /**
     * 发送企微信息
     */
    private void sendQwMessage(String noticeContent, List<String> accountList) {
        String eosUserToken = getEosUserToken();

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msgType", BusiEnumDefine.EOS_MSG_TYPE_QYWX);
        jsonObject.put("clientId", "hrssc");
        jsonObject.put("qwMsgType", 1); //企微消息类型 1=文本消息 2=图文消息 3=卡片消息
        jsonObject.put("agentId", agentId);
        jsonObject.put("adAccountList", accountList); //域账号id
        jsonObject.put("content", noticeContent);
        JSONObject sendResultJson = eosMessageClient.sendEosMessge(jsonObject.toJSONString(), eosUserToken);
        Integer code = (Integer) sendResultJson.get("code");
        String message = (String) sendResultJson.get("message");
        if (code != null && code == 1000) {
            log.debug("企微消息发送成功；accountList=" + accountList + ";noticeContent=" + noticeContent);
        } else {
            throw new AppBusinessException("企微消息发送失败：" + message + ";accountList=" + accountList + ";noticeContent=" + noticeContent);
        }
    }


    /**
     * 调EOS短信发送接口
     *
     * @param targetPhone
     * @param noticeContent
     */
    private void sendSmsMessage(String targetPhone, String noticeContent) {
        sendSmsMessage(targetPhone, noticeContent, null);
    }

    /**
     * 调EOS短信发送接口
     *
     * @param targetPhone
     * @param noticeContent
     * @param smsNo         短信序号（当内容过长时，分多条发送）
     */
    private void sendSmsMessage(String targetPhone, String noticeContent, Integer smsNo) {

        if (StringUtils.isEmpty(targetPhone) || StringUtils.isEmpty(noticeContent)) {
            throw new AppBusinessException("短信接收人手机号或短息内容不能为空");
        }
        //单条，且内容不足1000个字，直接发送
        if (noticeContent.length() < BusiEnumDefine.MAX_LENGTH_PER_SMS) {
            callSendSms(targetPhone, noticeContent);
        } else {
            if (smsNo == null) {
                smsNo = 1;
            }
            int endIndex = noticeContent.length() > BusiEnumDefine.MAX_LENGTH_PER_SMS ? BusiEnumDefine.MAX_LENGTH_PER_SMS : noticeContent.length();
            String sendPartContent = noticeContent.substring(0, endIndex);
            callSendSms(targetPhone, sendPartContent);
            String subContent = noticeContent.substring(endIndex);
            if (!StringUtils.isEmpty(subContent)) {
                subContent = "上接第" + smsNo + "条: " + subContent;
                smsNo = smsNo + 1;
                sendSmsMessage(targetPhone, subContent, smsNo);
            }
        }
    }


    public String getEosMsgToken() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("account", eosNemAccount);
        jsonObject.put("password", eosNemPassword);    //EOS上服务的账户和密码
        try {
            RestTemplate restTemplate = new RestTemplate();
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<JSONObject> reqEntity = new HttpEntity<>(jsonObject, httpHeaders);
            ResponseEntity<String> resEntity = restTemplate.exchange(eosMsgTokenUrl, HttpMethod.POST, reqEntity, String.class);
            JSONObject json = JSONObject.parseObject(resEntity.getBody());
            JSONObject data = JSONObject.parseObject(json.get("data").toString());
            return data.get("token").toString();
        } catch (Exception e) {
            e.printStackTrace();
            throw new AppBusinessException("获取Eos Token失败");
        }
    }

    public void sendEosMail(String sendTo, String copyTo, String content, String title) {
        sendEosMail(sendTo, copyTo, content, title, null);
    }

    public void sendEosMail(String sendTo, String copyTo, String content, String title, List<File> attachFileList) {
        if (StringUtils.isEmpty(sendTo) || StringUtils.isEmpty(content)) {
            return;
        }

        String eosMsgToken = getEosMsgToken();
        JSONObject mailObject = new JSONObject();

        List<JSONObject> mailAddressList = new ArrayList<>();
        String[] sendToAddress = sendTo.split(",");
        Arrays.stream(sendToAddress).forEach(Address -> {
            JSONObject ToAddress = new JSONObject();
            ToAddress.put("mailAddress", Address);//收件人集合
            ToAddress.put("type", BusiEnumDefine.SEND_TO_ADDRESS);//0为收件人，1为抄送人，2为秘送人
            mailAddressList.add(ToAddress);
        });
        if (!StringUtils.isEmpty(copyTo)) {
            String[] copyToAddress = copyTo.split(",");
            Arrays.stream(copyToAddress).forEach(Address -> {
                JSONObject ToAddress = new JSONObject();
                ToAddress.put("mailAddress", Address);//收件人集合
                ToAddress.put("type", BusiEnumDefine.COPY_TO_ADDRESS);//0为收件人，1为抄送人，2为秘送人
                mailAddressList.add(ToAddress);
            });
        }
        mailObject.put("msgType", BusiEnumDefine.EOS_MAIL_MSG);
        mailObject.put("clientId", BusiEnumDefine.EOS_CLIENT_ID);
        mailObject.put("mailAddressList", mailAddressList);
        mailObject.put("title", title);
        mailObject.put("content", content);
        if (attachFileList != null && attachFileList.size() > 0) {
            Map<String, byte[]> attachFileMap = new HashMap<>();
            attachFileList.forEach(attachFile -> {
                attachFileMap.put(attachFile.getName(), CommonUtil.getBytesByFile(attachFile));
            });
            mailObject.put("attachments", attachFileMap);
        }
        mailObject.put("sendMail", "App.NewEmployee@h3c.com");
        try {
            RestTemplate restTemplate = new RestTemplate();
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setContentType(MediaType.APPLICATION_JSON);
            httpHeaders.setBearerAuth(eosMsgToken);

            HttpEntity<JSONObject> reqEntity = new HttpEntity<>(mailObject, httpHeaders);
            ResponseEntity<String> resEntity = restTemplate.exchange(eosMsgSendUrl, HttpMethod.POST, reqEntity, String.class);
            JSONObject jsonObject = JSONObject.parseObject(resEntity.getBody());
            System.out.println(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            throw new AppBusinessException("EOS邮件发送异常");
        }
    }

    //  sendTo/copyTo都为地址，而非工号
//    public void sendEmail(String sendTo, String copyTo, String content, String title, List<File> emailFileList) {
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("Account", mailTokenAccount);
//        jsonObject.put("Password", mailTokenPassword);
//        jsonObject.put("Requestor", mailTokenRequestor);
//
//        try {
//            RestTemplate restTemplate = new RestTemplate();
//
//            HttpHeaders headers = new HttpHeaders();
//            headers.setContentType(MediaType.APPLICATION_JSON);
//            HttpEntity<JSONObject> requestEntity = new HttpEntity<>(jsonObject, headers);
//            ResponseEntity<String> responseJSONObject = restTemplate.exchange(mailTokenUrl, HttpMethod.POST, requestEntity, String.class);
//
//            List<JSONObject> ToAddresses = new ArrayList<>();
//
//            String[] sendToAddress = sendTo.split(",");
//            Arrays.stream(sendToAddress).forEach(Address -> {
//                JSONObject ToAddress = new JSONObject();
//                ToAddress.put("ToMailAddress", Address);//收件人集合
//                ToAddress.put("ToAddressTypeEnum", BusiEnumDefine.SEND_TO_ADDRESS);//0为收件人，1为抄送人，2为秘送人
//                ToAddresses.add(ToAddress);
//            });
//            String[] copyToAddress = copyTo.split(",");
//            Arrays.stream(copyToAddress).forEach(Address -> {
//                JSONObject ToAddress = new JSONObject();
//                ToAddress.put("ToMailAddress", Address);//收件人集合
//                ToAddress.put("ToAddressTypeEnum", BusiEnumDefine.COPY_TO_ADDRESS);//0为收件人，1为抄送人，2为秘送人
//                ToAddresses.add(ToAddress);
//            });
//
//            JSONObject mailObject = new JSONObject();
//            mailObject.put("ToAddresses", ToAddresses);
//            mailObject.put("Subject", title);
//            mailObject.put("Body", content);
//            if (emailFileList != null) {
//                Map<String, byte[]> attachFileMap = new HashMap<>();
//                emailFileList.forEach(attachFile -> {
//                    attachFileMap.put(attachFile.getName(), CommonUtil.getBytesByFile(attachFile));
//                });
//                mailObject.put("Attachments", attachFileMap);
//            }
//
////        mailObject.put("Priority", "7");
////        mailObject.put("DelaySendMilliseconds", 0);
//
//            HttpHeaders mailHeaders = new HttpHeaders();
//            mailHeaders.add("Token", responseJSONObject.getHeaders().get("Token").get(0));
//            HttpEntity<JSONObject> httpEntity = new HttpEntity<>(mailObject, mailHeaders);
//            ResponseEntity<String> mailResponseEntity = restTemplate.exchange(mailSendUrl, HttpMethod.POST, httpEntity, String.class);
//            System.out.println("发送邮件至队列成功！");
//        } catch (Exception e) {
//            System.out.println("发送邮件至队列失败！");
//            e.printStackTrace();
//            throw new AppBusinessException("发送邮件至队列失败");
//        }
//    }

    public void sendSmsForTest(String targetPhone, String smsContent) {
        sendSmsMessage(targetPhone, smsContent);
    }

    public String getSfsToken() {
        JSONObject pram = new JSONObject();
        pram.put("appId", appId);
        pram.put("pwd", pwd);
        JSONObject jsonObject = JSONObject.parseObject(sfsFeignClient.getSfsToken(pram.toString()));
        if (jsonObject.get("code").toString().equals("200")) {
            return jsonObject.get("token").toString();
        } else {
            return "";
        }
    }

    /**
     * 上传文件到sfs 返回文件id
     *
     * @param
     * @return
     */
    public String uploadFileToSfs(Integer busiType, File uploadFile, String busiId) {
        String shareLevel = "SPEC_APP";///SPEC_APP/CROSS_APP(本应用专属/跨应用访问)
        String token = getSfsToken();
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders httpHeaders = new HttpHeaders();
//            httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
        httpHeaders.set("Source-Account", appId + ":" + adminAccount);
        httpHeaders.set("X-Token", token);
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
        messageConverters.add(converter);
        restTemplate.setMessageConverters(messageConverters);
        MultiValueMap<String, Object> formData = new LinkedMultiValueMap<String, Object>();


        SdUploadFileDTO sdUploadFileDTO = new SdUploadFileDTO();
        if (uploadFile != null) {
            String fileName = uploadFile.getName();
            Integer index = fileName.lastIndexOf("\\");
            if (index >= 0) {
                sdUploadFileDTO.setFileName(fileName.substring(index + 1));
            } else {
                sdUploadFileDTO.setFileName(fileName);
            }
            try {
                ByteArrayResource resource = new ByteArrayResource(file2Byte(uploadFile)) {
                    @Override
                    public String getFilename() {
                        return sdUploadFileDTO.getFileName();
                    }
                };

                SdUploadFile sdUploadFile = new SdUploadFile();
                RestTemplate restTemplate2 = new RestTemplate();
                formData.add("files", resource);
                if (runMode.equals(BusiEnumDefine.SYSTEM_RUN_MODE_PROD)) {
                    formData.add("isDecrypt", "1");
                }
                formData.add("shareLevel", shareLevel);
                formData.add("path", path);
                formData.add("parentFileSid", parentFileSid);
                httpHeaders.set("Content-Type", "multipart/form-data");
                HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(formData, httpHeaders);
                ResponseEntity<String> responseJSONObject = restTemplate2.exchange(url + "/file", HttpMethod.PUT, requestEntity, String.class);
                //ResponseEntity<String> responseJSONObject = restTemplate2.exchange(url + "/file", HttpMethod.PUT, requestEntity, String.class);

                log.info("上传附件返回接口：{}", responseJSONObject.getBody());
                String fileId = JSONObject.parseObject(JSONArray.parseArray(JSONObject.parseObject(responseJSONObject.getBody()).get("data").toString()).get(0).toString()).get("fileSid").toString();
                sdUploadFile.setFileId(fileId);

                CustomBeanUtils.copyProperties(sdUploadFileDTO, sdUploadFile, false);
                String operatorId = getLoginUserId();

                sdUploadFile.setOperatorId(operatorId);

                sdUploadFile.setUploadTime(new Date());
                sdUploadFile.setBusiType(busiType);
                sdUploadFile.setBusiId(busiId);
                sdUploadFileMapper.insertSdUploadFile(sdUploadFile);
                return fileId;
            } catch (Exception e) {
                e.printStackTrace();
                throw new AppBusinessException("上传文件失败");
            }
        }

        return "";
    }

    /**
     * @title: previewFile
     * @description: 预览sfs文件，传入关联业务（针对仅关联单个文件的业务）
     * @params: [busiId, busiType]
     * @return: java.util.Map<java.lang.String, java.lang.String>
     * @createTime: 2021/6/29
     * @version:
     * @author: f23104
     */
    public Map<String, String> previewFile(String busiId, Integer busiType, String fileId) {
        String token = getSfsToken();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Source-Account", appId + ":" + getLoginUserDTO().getAccount()); //预览水印 :getLoginDomainAccount()
        httpHeaders.set("X-Token", token);
        httpHeaders.set("Content-Type", "application/json");
        MultiValueMap<String, Object> formData = new LinkedMultiValueMap<String, Object>();

        String sendFileId = null;
        if (StringUtils.isEmpty(fileId)) {
            QueryWrapper<SdUploadFile> fileWrapper = Wrappers.query();
            fileWrapper.eq("busi_type", busiType)
                    .eq("busi_id", busiId);
            SdUploadFile sdUploadFileInDB = sdUploadFileMapper.selectOne(fileWrapper);
            if (sdUploadFileInDB != null) {
                sendFileId = sdUploadFileInDB.getFileId();
            }
        } else {
            sendFileId = fileId;
        }

        Map<String, String> res = new LinkedHashMap<>();
        if (!StringUtils.isEmpty(sendFileId)) {
            RestTemplate restTemplate2 = new RestTemplate();
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("enableWatermark", 1);//是否启用水印，0/1:不启用/启用
            jsonObject.put("requestType", 0);//是否启用http预览，0 启用；不传 requestType  ，默认使用https服务（研发访问时有证书失效问题）
            HttpEntity<JSONObject> requestEntity = new HttpEntity<JSONObject>(jsonObject, httpHeaders);
            ResponseEntity<String> responseJSONObject = restTemplate2.exchange(url + "/file/preview/" + sendFileId, HttpMethod.POST, requestEntity, String.class);
            if (JSONObject.parseObject(responseJSONObject.getBody()).get("code").toString().equals("200")) {
                String url = JSONObject.parseObject((JSONObject.parseObject(responseJSONObject.getBody())).get("data").toString()).get("previewUrl").toString();
                res.put("code", "SUCCESS");
                res.put("fileUrl", url);
            } else {
                res.put("code", "FAIL");
                res.put("errorMsg", "未找到文件，请稍后再试");
            }
        } else {
            res.put("code", "FAIL");
            res.put("errorMsg", "未找到文件，请稍后再试");
        }
        return res;
    }

    public Map<String, String> previewFile(String fileId) {
        return previewFile(null, null, fileId);
    }

    public Map<String, String> previewFile(String busiId, Integer busiType) {
        return previewFile(busiId, busiType, null);
    }

    public String deleteSfsFile(String fileId) {

        String token = getSfsToken();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Source-Account", appId + ":" + adminAccount);
        httpHeaders.set("X-Token", token);
        httpHeaders.set("Content-Type", "application/json");

        QueryWrapper<SdUploadFile> fileWrapper = Wrappers.query();
        fileWrapper.eq("file_id", fileId);
        SdUploadFile sdUploadFileInDB = sdUploadFileMapper.selectOne(fileWrapper);
        if (sdUploadFileInDB != null) {
            sdUploadFileMapper.deleteById(sdUploadFileInDB.getFileId());
            RestTemplate restTemplate = new RestTemplate();
            HttpEntity<JSONObject> requestEntity = new HttpEntity<>(httpHeaders);
            ResponseEntity<String> responseJSONObject = restTemplate.exchange(url + "/file/" + fileId, HttpMethod.DELETE, requestEntity, String.class);
            System.out.println(responseJSONObject.getBody());
            String code = JSONObject.parseObject(responseJSONObject.getBody()).get("code").toString();
            return code;
        } else {
            return "";
        }

    }


    public File getFile(String fileId, String fileName) throws IOException {
        //删除文件缓存
        File tempDir = new File("./download/");
        if (tempDir.exists() && tempDir.isDirectory()) {
            File[] tempList = tempDir.listFiles();
            String timeStr = DateUtils.dateFormat(new Date(), "yyyyMMddHH");
            for (int i = 0; i < tempList.length; i++) {
                String fileTime = DateUtils.dateFormat(new Date(tempList[i].lastModified()), "yyyyMMddHH");
                if ((Long.valueOf(timeStr) - Long.valueOf(fileTime) > 10)) {
                    tempList[i].delete();
                }
            }
        } else {
            tempDir.mkdirs();
        }

        String token = getSfsToken();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Source-Account", appId + ":" + getLoginUserDTO().getAccount()); //预览水印 :getLoginDomainAccount()
        httpHeaders.set("X-Token", token);
        httpHeaders.set("Content-Type", "application/json");

        MultiValueMap<String, Object> formData = new LinkedMultiValueMap<String, Object>();

        RestTemplate restTemplate2 = new RestTemplate();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("enableWatermark", 1);//是否启用水印，0/1:不启用/启用

        ResponseEntity<byte[]> response = restTemplate2.exchange(
                url + "/file/" + fileId,
                HttpMethod.GET,
                new HttpEntity<JSONObject>(jsonObject, httpHeaders),
                byte[].class);
        if (response.getStatusCode().value() == 200) {
            ByteArrayInputStream stream = new ByteArrayInputStream(response.getBody());
            File file = new File("download/" + fileName);
            InputStream ins = stream;
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
            return file;
        } else {
            throw new AppBusinessException("未找到文件，请稍后再试");
        }

    }

    /**
     * 动态替换邮件参数值
     *
     * @param content           邮件内容
     * @param needReplaceParams 需要替换的内容 key-替换前的内容 value-替换后的值
     * @return 邮件内容
     */
    public String dynamicGetEmailContent(String content, Map<String, String> needReplaceParams) {
        if (needReplaceParams == null || needReplaceParams.isEmpty()) {
            return content;
        }
        for (String needReplaceKey : needReplaceParams.keySet()) {
            content = content.replace(needReplaceKey, needReplaceParams.get(needReplaceKey));
        }
        return content;
    }

    /**
     * 根据合作员工工号 查询合作员工的工号，姓名，域账号，1到3级部门id,直属部门ID，邮箱。
     *
     * @return 返回对象
     * {
     * "dept_code": "",
     * "emp_code": "",
     * "emp_name": "",
     * "dept3_code": "",
     * "domain_account": "",
     * "display_name": "",
     * "dept1_code": "",
     * "dept2_code": "",
     * "email": ""
     * }
     */
    public Map<String, String> queryCooperativeWorker(String workerId) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("empCode", workerId);
        String workerInfoStr = dataCenterFeignClient.queryCooperativeWorker(jsonObject.toString(), getPerformanceToken());
        JSONObject basicInfoJson = JSONObject.parseObject(workerInfoStr);
        List<Map<String, String>> basicInfoList = (List<Map<String, String>>) basicInfoJson.get("data");
        if (CollectionUtils.isEmpty(basicInfoList)) {
            return null;
        }
        return basicInfoList.get(0);
    }

    /**
     * 根据正式员工工号 查询正式员工的工号，姓名，域账号，1到3级部门id,直属部门ID，邮箱。
     *
     * @return 返回对象
     * {
     * "dept_code": "",
     * "emp_code": "",
     * "emp_name": "",
     * "mobile": "",
     * "dept3_code": "",
     * "domain_account": "",
     * "dept1_code": "",
     * "dept2_code": "",
     * "email": ""
     * }
     */
    public Map<String, String> queryOfficialWorker(String workerId) {

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("empCode", workerId);
        String basicInfo = dataCenterFeignClient.queryWorkerBasicInfo(jsonObject.toString(), getEosToken());
        JSONObject basicInfoJson = JSONObject.parseObject(basicInfo);
        List<Map<String, String>> basicInfoList = (List<Map<String, String>>) basicInfoJson.get("data");
        if (CollectionUtils.isEmpty(basicInfoList)) {
            return null;
        }
        return basicInfoList.get(0);
    }

    /**
     * 查询员工邮箱
     *
     * @param workerId 员工id
     * @return 员工邮箱，正式和合作都查询不到即为null
     */
    public String getUserEmail(String workerId) {
        Map<String, String> officialWorker = queryOfficialWorker(workerId);
        if (officialWorker != null) {
            return officialWorker.get("email");
        }
        Map<String, String> cooperativeWorker = queryCooperativeWorker(workerId);
        if (cooperativeWorker != null) {
            return cooperativeWorker.get("email");
        }
        return null;
    }

    public String getSapToken() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("appId", sapAppId);
        jsonObject.put("appSecret", sapAppSecret);
        try {
            JSONObject result = sapClient.getToken(jsonObject.toJSONString());
            return result.get("data").toString();
        } catch (Exception e) {
            throw new AppBusinessException("获取SapToken失败");
        }
    }

    public String getSapToken(String hrssAppId, String hrssPassword) {
        try {
            JSONObject result = sapClient.getAppSecret(hrssAppId, hrssPassword);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("appId", hrssAppId);
            jsonObject.put("appSecret", result.get("data"));
            log.info(result.toJSONString());
            JSONObject token = sapClient.getToken(jsonObject.toJSONString());
            boolean success = (boolean) token.get("success");
            if (success) {
                return token.get("data").toString();
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public Object getJobSalaryInfoFromSap() {

        try {
            JSONObject result = sapClient.getJobSalaryInfo(new JSONObject().toJSONString(), getSapToken());
            return result.get("data");
        } catch (Exception e) {
            throw new AppBusinessException("获取职类职级配置的宽带中位值信息失败");
        }
    }

    public void output(HttpURLConnection conn) {
        String data = "Data: HelloNode SSE.\\n\\n";
        try {
            byte[] dataBytes = data.getBytes();
            conn.setRequestProperty("Content-Length", String.valueOf(dataBytes.length));
            OutputStream os = conn.getOutputStream();
            os.write(dataBytes);
            os.flush();
            os.close();
        } catch (Exception e) {
        }
    }

    public void readStream(InputStream is) {
        BufferedReader reader = null;
        StringBuffer sb = new StringBuffer();
        try {
            reader = new BufferedReader(new InputStreamReader(is));
            String line = "";
            while ((line = reader.readLine()) != null) {
                //这里可以写接收消息后的逻辑

            }
            reader.close();
        } catch (Exception e) {
            System.out.println("Error:" + e.getMessage());
        }
    }

    public String getPmMidToken() {
        String pmMidTokenKey = "NEM-Portrait-TOKEN";
        String storedToken = RedisUtil.get(pmMidTokenKey);
        if (StringUtils.isEmpty(storedToken)) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("account", "eos_prs");
            jsonObject.put("password", "RvXMH3lA24VGCQOW");
            JSONObject eosToken = dataImageClient.getEosToken(jsonObject.toJSONString());
            Integer code = (Integer) eosToken.get("code");
            if (20220 == code) {
                LinkedHashMap<String, Object> object = (LinkedHashMap) eosToken.get("data");
                String token = "Bearer " + (String) object.get("token");
                RedisUtil.setEx(pmMidTokenKey, token, 3, TimeUnit.HOURS);
                return token;
            } else {
                throw new AppBusinessException("获取eosToken失败");
            }
        } else {
            return storedToken;
        }

    }

    public LinkedHashMap getPortrait(String workerId) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("empCode", workerId);
        JSONObject res = dataImageClient.getWorkerPortrait(JSONObject.toJSONString(jsonObject), getPmMidToken());
        if (res.get("data") != null && ((ArrayList) res.get("data")).size() > 0) {
            return (LinkedHashMap) ((ArrayList) res.get("data")).get(0);
        } else {
            LinkedHashMap map = new LinkedHashMap();
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("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AQwYwYABBTAxMPxlYGBkYGBkYPjPgACMDKjgy5cv3759//LlEy8vHwMD4/fv31hYWJmZWf79+8eAAv4zMDAygAAjA8N/BgT4zwAD//79//fv3///DBDw79/f//8Z////w8zIzMTExMDAwAwEjIx/wYCBmYVhFAxfwMIwCmgCGBkY/jPQADDCwJ8/f379+vXnzx8GBgZmZua/f/8yQAEjA8N/BihgZGVlY2Ji+v//358/v79///Xnz98fP34Cwd+/f/6DAQMY/P///+/fv//+/WNmZmYgFjAyMPz//5/xz59/7969//Tpy/////78+ff3719GRgYmJiYGhv8MDIwMCMDIwPCfgeE/AwMjAxbwnwEEGBkYGBlA4D8DFsDIwPCfAS/4++cfIyMTExMjBDAwMPwHgz9//jAyMjGCAAMjCDD8///v719GBhBgZGBgZGBgZGD4z8Dwj4HhPwMIMDEwMDEwMDIw/Gdg+McAA//+/WNkZGZkZPrz59e/f384ONiYmZn+/PnHyMjExsYmJCTIz8/35cuXX79+f/nyhZmZmZGR+R8YMIEBIyPj////GRDgHwMDIwMI/GdAgP8MDIwMqICVlfUHCHz79u0HGxvrPxD4z8jIgAEYGaDgPwMK+M/AwMjAwMDIyPj3758fP378//+fgeEfMxMTGxsrMzPTt2//mZiYGRkZ/v79y8jIyMLCwsT0/9efP8wMo2A4AxaGUUAT8J+BIvCfgYGRgYGRgeE/AypgYmL6////379/f//+/efPn3///jEyMv7//48BAf4zgMB/BgZGBgZGMGD4////z58/P3789P37j79//zIyMvz//58BBv7//8/AwMAEBgwkgP8MDAysrKyMjIz/////+/fv////mUGA6d+/fwxQwMiADpgYsID/DAyMDAyMDAyMDCDwnwEEGBmwAEYGvICFhZWRkYGRkYGRkYmBgeH///+MjIz///9nY2NnYGBgZGRgZGT8//8fEPz9+w8IWFhYGBgYGUDgPwPDPwaG/wwgwMTAwMQAAv8ZGP4xMPxnYGBkYGBkYGBgYmL+8+ff//9/mZgY2NjYWFiZf//+++3bD1FREV5eLgEBfg52NmZmlq9fv/3+/fvnz59srKxMMMDAwPDv37////8zMjIyoABGBob/DAjAyMDAyMDwnwEJsIAAMwMDAyMj479/f//9Y/j798////+ZmZkZUAAjA8N/BuyAkYHh/69fv96/f//t2zcmJiZGRkYOdlZubi4uLm5WVlYmFmbG//9+/fr779+/////MzMzMzGyMIyCYQ0Yf/z4wTAKBhL8Z2BgZMACGBkY/jNggP/MbL/B4M+fP////2cAg////zMyMjJAwX8GBkYGEGBkYGD4++fPr1+/voPAj58/f/3794+RkYGZmen/fwYmJiZGRsb/YMDAwMDIyMjExPT7928GEsD/Hz9/sLCwMDIy/vv3j4mJmZWVhYmJ8d+//3///mUgGTAygMB/Bob/DCDAyIAF/GdgYGTADZiZWBgY/oMBw79///7////v37///xlYWJgZGRkZGP4zMjIygADj//8MQMDIyMDAwMjA8J+B4T8Dw38GBkYGBiYGBkYGEPjHwPCfgeE/AwMjAwMjAwgwAsGfP38YGP6zsDAxMP7/+/c/AwMTKyurvLwMFxcHFycHAwPjfwaGb9++v3z5/PXr1///sTAwMLCwsDAzM//9+/f3798MDAysrKz//v1jgAJGBob/DAz/GRgYGXCD//////v3j5GRiZmZiZGR8d+//////2NgYGBkZGRAAYwMDP8ZQOA/AwMjAwZgZmT4///f//8Mf8GAiYmRk4Odg4NDSEiYl5eHnZ3l359/f//+ZWJiZmZm+g8EjAyjYBgDxh8/fjCMgkEHGBkY/jNgA7//M/3+/fvXr1///v1jYmJiZGT8////v3//mJiYGKDgPwMDIwMIMDIw/P//7/+7d+/ev//w9+8/dnZ2Fhbmv3///P3778+fP0xMTIyMjAwMDP/BgBEGGIgF/xkYGFnZWJiYmP7///8PBP4zMPz7////37//mJiYGBgYGRj+MxALGBlA4D8Dw38GEGBkwAL+MzAwMuAF//7+Z2RkYGRkYmRkZGJiYmRkZGJiYmBg+Pnz5////xhAgJGBgYGRkYkRBBj+///PAAL/GUCAkYGBkYGBkQEE/jEw/GMAAUYGBiYGGGBkZPz//y8TEyMD4/8fP37//ftPSEhIQkKUj4+HjY2VgYHx79//LMyMDAwMn798fvHixft3X/7+/cvExMjCwvrv37/fv38zMjKysbH9/fuXAR0wMYDAPwZs4P///4xg8P//v3//GP7//8fExMjMzPLv3z8GdPCfgYGRAR0wMjD8Z2BgYGVjYfz3nwEM/v379/fvXwYGRhZmBhYWFn5+PiEhYW5ODkZGxn9gwMjI+J+RYRQMY8DCMAoGADAyMPxnIAz+MzAwMqCCnz9//vv3j4GBgZGR8f//f///MzIwMDAyMjEgACMDAyMDCPxnYPj/7du3X79+//v3n5GRkYHh358//4Dg799/LCwsDAwM////Z4QBBgaG////M5AAGBkYGL59+/b//38mJiZmZmYmJqb///8xMDCysLD8+/ePgeE/A7GAkYHhPwMI/GcAAUYGBkYGhv8M6ICRgRBgZmb6/5/h/3+Gv3///IcBBob/nJxc/8GAgYHxPwj8+w8GjIxMDAz/GUCAkYGBkYGBkYHhPwPDPwaG/wwgwMTAwMjAwMjA8J+B4T8DA8O//3+YmZkYGRn//mVgYWHl4+MUExMWFhb4/5+BgYHx/38GBoZ//xmYGBkYOTk5JSQkGBjefPny5efPn3///WViZAICBgaG////M6ADJgYU8J+BgZEBCbCwsDAyMjEw/Pv7l4GB4R8Dw38GBqb///8zoIP/DAyMDFjAfwaG/wwMjN++fv/37x8TMyM7CysjI+P//////fv77x/jr18///79w8DAxCwqwsnJzvCP4f///4yMjAyjYFgDFoZRMADgPwMCMDIw/GdAB/8ZGP4zMDAyYIBfv34xgcH//////v37//8/JiYmZmamf//+MUABIwPDfwYQ+M/AwPD69dv///+zsbExMv7//fv3nz9/mZmZ2dk5/vz5/e/fv////zMwMDAxMTEyMjIwMDAyMv7//5+BWMDIwPCfi5P7z58/////Z2ZmZmD4//vPv////zOyMDD8Z2QgDTAyMPxnYGBkYGBiAIH/DAyMDKSD/wxAwMjI+J+FhYURCfz69YuRkZGBgZGB4T8Dw39GRob///8zMDAygAAjAwgwMoDAPwaG/wwM/xkYGBkYGBkYmBhA4B8DCPxnAIP//xn+/Pn7/z8DHx+vhIQYPz8PAwMjEPz7x8DExMDCzPzv/98/f/8xMjLy8vD+EWH4////r1+/////x8jMxMzC9BcMGBkZGRCAiQEdMDKggh8/fjAzMzMyMjAyMjMzMzEyMv3/z/Dv3z9GRkYGFMDIgBMwMjAwcHFx/fr16x8QMDAyMTEy/mNkZmZiYmL+94/xx49fHz9+5OLiZGFh+f//37///5iYmBn+/2cYBcMXMP748YNhFNAb/GdgYGQAAUYGhv8MWMB/BgbG//8Z/v//xwgGf//+/fnz5+/fv/8xsTJgAf///2dgYWH5/fs3MzPzv3//GBj+s7Kyvn37/t3b9wwM/xkY/jOAACMDCDAyMPxnoBVgZGD4z0AO+M/AwMjAwMgAAv8ZQOA/AwMjAwpgZGD4zwAC/xkYGBlwAkYGhv8M6ICRAQT+M4DAfwYQYGRAAEYGEPjPwPCPAQQYmZhY/v37/+/fv////zIyMkDA////2TnYf/z4+f8/g5CQoLS0JB8v538Gxm/ffnJwcDAw/GNg+M/A8J+BgZEBBpiZmN9/+Pj8+fPPnz8zMDAxMzP/////79+/DP8ZmcCAAQSY/oMBAwj8YyAAGBkY/jEwMDIwMDIw/GegEDD+Z/r/n4GBkYOD4/XrN6Iigj9+fNfV1WNkZOTkZP/x4xcj43+GUTB8AQvDKBgAwMgAAowMDP8ZGP4zMDAyoID/DAyM//79ZwIBZgYGhr9///758+ffv38MOAEjIyPD////GRgYGMGAgYHx37//v3//ZmD4z8DwnwEEGBkYGBlA4D/DoAP/GRgYGRgYGUDgPwPDfwYQYGRAB/8ZoICRAR/4z8Dwn4GBkQEBGBkY/jOAwH8GKGBkYGBkAIH/DAyMDAz/GRj+MzD8Z2BgZGBgZGBg/PXrNwsLMxsbCwMD079////9+8fIyMTIyPT16zdeXj5BQX5+fh52dpY/f/8zMjJxcnL8//+XAQT+MzAwMgAB4z8GMPjPwMTDwyMpKcnGxvru3fvv37+ysrJzcHD8/PmTgYHh379/DDDAyMjIwMDw/z8DXsDIwPCfAQQYGRj+M2ABjAwM/xmIB/8Z/zEyMP1n+Pv3HwsLy7//DAwMjN++fePm5vn3j2EUDHvAwjAKBgYwMjD8Z8AOGBkYGP///8fA8J+Rkenfv3+/weDfv3+MjIwMeMH///8ZGP4zMTH9////799/v379ZGD4zwACjAwMjAwg8J8BBP4zMDAyUAr+MzAwMqAARgaG/wwM/xkYGBlIA4wMDIwMIPCfgeE/AwgwMkABIwPDfwYo+M/AwMhAGPxnYGBkAAFGBob/DCDwnwEE/jOAACMDCDAygMB/BhD4z8DwnwEEGBkYGBkYGBkYGJmZmf7+/f337y8mJiYWFjZmZuY/IPCTh4dHSIhPXFyEnY3133/G37//MjMzMDMx/P3/nwECGP8zMPxngIE/f/6wsrAKCvAxMzP+/8/w/v37f//+/fnzh5mZ+f8/hv9gwMDwnwEMGBkZGQiD/wwMjAwM/xkY/jMwMDKgg/8MeMF/RiYGEPjH+J8BCv4z/WP89+fPH3Z21r9///5nYPrw8SMPD8/fv38ZRsFwBywMo2AAACMDw38GEPjPwMDIgA0wMzMxMPz/AwN///5lYGBgZGRkQAH/GRgYGUCAkZGR4f///wwMDIyMTIyMjH///vv378/v378YQICRgYGRAQT+MzD8ZwABRgZKwX8GBkYGKGBkYPjPAAL/GRj+MzAwMpAJ/jMw/GcAAUYGBkYGEPjPwPCfAQEYGaCAkYHhPwNOwMjAwMgAAv8ZoOA/AwgwMkABIwMI/Gdg+M/AwMgABYwMDIwMDIwMDP8ZGP4xMf1nYmL+/5/h799/P3/+YmJiYmVl5eBgV1CUYWVlYWJi+s/AxMjIwMrK8v//3z9//zEyMjIwMDKAwH8GJPCf4e/f/wxMjCw8PDzMzMycnJxv3rz5/PkrFxcXAyPD////GWDgPxgwMjLgBf8ZGBgZGBgZGP4xMDAyYAH/GRgYGQgDpv+M/xj/M0DBf8bf//+ws7L++8fAwMD4+fNXBkbGv3//MoyC4Q5YGEYBvQEjA8N/BhD4z8DAyMDAyMDwnwEFMDIw/GdmZvr9+8/Pnz9///79//9/RkZGBgaG////MzAyIAFGBij4z8DAyIAC/jMw/GcAAUYGBkYGEPjPwPCfAQQYGagAGBmggIkBBBgZqAMYGRgYGRgYGUDgPwMDIwMI/GdgYGRAB4wM2ME/BgZGBhD4zwAC/xkYGBkYGBmggJEBBP4zgMB/BgRgZGBgZACB/wwM/xkY/v3+/YeTk5uVle3Xr9/fv39jYmIUEREWFRXh4mL5z8D469efX7/+srAwMzH9////379/f5mZWRmAgPE/A8N/BiTAxMT0588fBoY/bKyc3FzcLCws////Z2Rk/PXrzz8g+PufEQQYGBkZ/4MBIyMDXvCfgYGRgeE/A07AyEAsYPrPyMD4/x8Dw38GBob///4zMTH//fuHgeH/79+/GRgY//1nYGT8z8gwCoYzYGEYBfQG/xlA4D8DAyMDAyMDw38GBGBkYPjPwPCfgeH/379///z58/v3n79//zKCAQNe8P//fyYmJgYGhv9gwMDAwMTExMrK9vPvbwYQ+M/A8J8BBBgZGBgZGP4zUAEwMjD8ZwCB/wwMjAwIwMjA8J+BZPCfAQQYGRgYGUDgPwMI/GcAAUYGKGBkYPjPQBT4zwAC/xkYGBmggJGB4T8Dw38GKPjPAAKMDAyMDAz/GRgYGUDgPwPDfwYQYGRmZv3589fPn7/Z2FhFRUUEBPj5+Pg4OJj//Wf4/5+RhYX1/3+G/////f37h5GRkZmZlYGBkYHxHwPDfwaG/wwMjAwwwMzEzMDA8O/f/3//fzMzsgKBiIgILy/v48dPfwPB/z///v1jYPjPCAYMDEwMDH8Z8AFGBgZGBoZ/DAyMDAyMDAz/GSgD/xkZGP//Z2BgZGJi/svAyMDwn4HhPwsLMwMDIwPDf0ZGZgaGPwyjYPgCFoZRMADgPwMDIwMW8J8BBP4zMDB8//7j37//jIwMTExMDAwM////Z8ACGBkY/jOAwH8GBkYGBgZGRkYGBoZ///4xMDAwM7OwsbH//PGbgeE/A8N/BhBgZGBgZMAOGBkY/jOQBv4zYAGMDAz/GcgBjAwgwMgAAv8ZGP4zgAAjAwr4zwAF/xkYGBlwgv8MDP8ZGBgZGBgZoICRgeE/AxT8ZwABRgYQYGRg+M8AAv8ZQOA/AxQwsrGx//79i4mJiY+PR0JCgoeHnYGB4efP//8Z/rKwsLIwMwDBn79//v37x8TEwszM/O/fPwaG/wwM/xkYGBkQ4B8DAwMTEyMQ/P///8//X4wMzOzs7Jwc7P/+MXz9+vXzpy/fvn37+/c/EDCCAQMBwMjA8J8BBBgZGP4zYAGMDAz/GUgATAwM/xgYGJiYmP/++cvEyMDAwMjOzsHAwAgEDKNguAMWhlFAb/CfgYGRAQQYGRj+MzD8Z2BgZEABjAwMDD9+/GRmZmJmZmZiYvr79++/f/8YGBgYGRkZUMB/BhD4z8DA+P//f0ZGRgYGhv9gwMDAwMTEzMrKysDwn4HhPwMIMDIwMDIw/GfAAhgZGP4zkA8YGRgYGRj+M4DAfwbyASMDCPxnYPjPAAKMDCDAyMDwnwEdMDLgA/8ZGBgZQICRAQT+MzD8Z4CC/wwMjAwgwMgAAv8ZEOA/AwgwMjAwMjAw/v79S1BQQFRUhIeHi4mJ8c8fRgYGBjY2xn//mRgZGf79/8/A8J+RkQkIGBiY/v37x8DwnwEd/GMAg/////3795+RkQkIGBmY/v37+/svg5AgHw8PDyMD09+/f3/8+PXv37////8zMPxnZGQgBP4zMDAygMB/BgZGBnTwn4FkwMjA8J+Jien3758MLEyM/xnZ2Nj+///PCAYM/xlGwTAGjD9+/GAYBfQGjAwg8J+B4f+//yz///9nZGRkYmJiZGT48+fvjx8/fv78xczMxMDwn4GBkQEV/GNkIBowMjD8f/jg4f///xkZmRgZmX7//vXnzx9mZmZ2dvY/f/4wMDD8BwMGBgZGRob//xn+/fvHwsLCQAr4//8/KysbA8P/379/MzAwMDMzMzIy/vnzh4mJiYEUwMjI9P//v////zMw/GdkZGJkZGRgYGRgYPj3/w8DFsDIwPCfARtgZGRkYPjPwMD4/z/D////GRj+AwEDw392dnYGBsZ/YPD37z8GBgZGRgYmJkbG/78ZGZkYGP7/+/f/379/jIxMbGCgqqrMCAZMTEyMjMyMjIwMYPDv318Ghv8MDP8ZGBgZGJgYGBgZGP4zMPxjgAJGBuzgPwMDIwMS+PfvHwsLCyMD489fPz9+/Pju3buPHz/+/PmTi5Pn//////79Y2BgYGRkZGJiYQCD////MzEx/fv3/9evnw2sHWoAACAASURBVAwMTGxsrIyMjH///v3PyMiAAv4zMDAy4Ab/GP4zMTExMjL+BQNGRkYWZiBg+vXrFwPDPwYGJi52djEQEGVmZv7+/TsrCxPDKBi+gPHHjx8Mo4DegJGB4T8Dw38GBoa//1iYmBiB4P///3///v39+/efP3///fvLwPCfAQQYGVDBP0YGUsD/b19/fPr06fPnLwwM/9nY2BgY/v/79//v37+MMMDExMQIAgwMDIz/wICBFPDnzx8mJiZGRsb///8zgsH//////v3LxMTEQApgZGT8//8/A8N/BgZGIGBgYGRg+A8ETMyMDAz/GRgYGRCAkYHhPwMBwMjA8J8BBP4zMDAyMjJ8//6DGQRYmJiYGBkZ////x8Dwn4GBgfH/n/9gwMDAyMbGxsfHJyQkyMvLw8Dwn5GRiZGRiZGRiZGRkQEK/v3//4+BgZGBgZGBgZGBgZGB4T8Dwz8GKGBkYGBkYPjPgA7+MzAwMjAwMjD8Z0ACjGDw////X79+ffv27evXrz9//nz75j0DAwMjIyMTExMjI+P//////WP4+/cvIyMjMzMzAwPD//8MQMDExMjAwPgPCBjQwH8GBkYG3OA/IwMjIyMTExMjIyMDA8P//////f3z9+9fdna2X79+Mf1n5OfnFRUV5eXlYWJi/vfvHyPDP4ZRMHwBC8MooDdgZGD4z8DwnwEEGCGAgYHh379/v379+vPnDwMDAxMT479//xkYGBkoAv8ZGBi5uLh//PjJxPTt79/fDAz/WVhY//79y8DA8O/fv////zMwMPz9+5eB4f+/f////fv3//9/NjY2BmIBIwPDfzY2tv///zMwMDAzMzMxMf0DA2ZmZgYSASMjIwPDf0ZGJgYGRgYGhv///zEwMPz////f/z8MDIwMKOA/Awj8Z2BgZMAA////Z2BgZGT8zwAC/xkYGBkYGP7/Z+Dm5mFkZGBkZGRgYPgHAgz//zMwMDD+/8/AxsbGxcXNBQKcQMDFxcnIwPj7zx9GRiZGRkYGKPj///8/BhBgZGBgZGBgZGBgZGD4z8Dwj4HhPwMDIwMDIwMDIwMW8J+BgZGBgZGB4T8DEmBkZPwPBsxMzBzsHBzsHDw8PL9+/WJj5fj169e3b99+/Pjx9+9fBgYGRkZmJiam//////37l4mJmZGR6f//v79+/fn/n4GJiZGRmZkBCv4zMDAyMDAy4AVsbGy/f//++fMnAwMDCwsLExMTIyMDMzPz379///1j4ORg4+fn4+bmYmBg+PPnDxMTE8MoGNaA8cePHwyjgN7gPwMDIwMIMDIwsvz////fv3+/f//+9evXv3//GEGA4f9/BgYGRgaG/wyo4B8jAzbwn4GBkQEd/GdgYPr39/+vXz+/g8C3nz9//fv3j5GRkZmZmYmJ6f///wwMDIyMjP/+/fv79x8Dw38mJqb///8zkAj+/Pn9/z8DCwsLIyPj379/////z8zM/O/fPwZSwP///5mYmBgZmRgYGP7///cfBP4xMDAyszAxYAH/GRgYGbABRkbG////MzD8Z2Bg+P+fAQYYGRkZ/oPBv3//GBj+MzMzs7Gxs7Cw8nKzc3Fx8vHxcXFxMTKAwL////7+/cfIyMTIyMgAAv8ZGP4zMDD8//+fgYGBkZGZgYGRgeE/A8N/Bob/DAz/GRgYGRiYGKDgPwMK+M/AwMjAwMgAAv8ZUMF/MGACA0YGxn///wEBMxPL9+8/Pn78+Pnz5+/fv//+/fvfv38MDEwsLCz//v1jYGBgYmJmYPj/9+9/RkYGNja2bz9+MIDAfwYGRgYQYGRg+M+AG7Cwsf7+/fvPnz+MjIxMTEyMDP8ZGRmYmJi/ffvGzcEpIiIoKirKycn179+/P3/+MDAwMDMxjIJhDBh//PjBMAroARgZGP4zgMB/BgZGBhBgZGD4z8jE+vv3n1+/fv358+f///8MDAz////7/5+BiYmZgeE/Awb4x8hACmBkYmQCgn///n79+u3jx4/fv3//+/cvIyPj//////37x8jIyMLC8h8MmJmZ2djYfv78yUAKYGFh/vv3HwMDIyMjw//////9+8fIyMjCwvLv3z8GUsC/f/8YGRmZmJj////3799fBhBgZGJi+vf/LwMDIwPDfwbiACMjIwMI/GdkZGJgYGBkZGJg+M/IyPj7928mJiZmZiZWVjZ2dnYuLi5ubh52dnYuDmZGIGBg/M/w7//////+/WcAAUYgYGD4z8DAwMjI8P//fwYGhv//Gf7/Z2BiYmZg+M/A8J+B4T8Dw38GBkYGBiYGEPjPgB0wMoDAfwaG/wwMjAww8O/ff0ZGBkZGxn9gwMDAwAQD//////eX4c+fPz9//vz69euXL19+/Pj158+f379///nzl5GRgZGRiZGRiZmZiYWF5efv3wwIwMjA8J8BL/j7/x8jIyMLCDD/+/v3169ff//+ZQYBFjFhQRERITY2DgYGBkZGJkaGv////2cYBcMaMP748YNhFAwAYGQAgX9//zH9/v3n169f//79YwSDfyDwn5mZmYHhPwMG+MfIQDRgZGD4z8jAxMTE+P8/w58/f//8+f3nz58fP378/PnzLxgwMjIyMzP/+fP3588fjIyMbGxs//79YyAF/Pjxg52dg5mZ6S8YMDIyMjMzMzIy/v//nwE7+M/AwMiAAf79+8fExMTIyPj//z8gYGBgZGJiYmZm+fP3BwN2wMjA8J8BA/z//5+RkYGRkYmJiZkJBBiZmJgYGBjExcVYWFghgAUEmBkZQICJ4T8DA+Pff3///fv3//9/RkYmCPj37y8Dw38GKGBkYGD4/58BCBgZGRkY/jEw/GdgYGRgYGRgYGQAgf8M2AEjAwj8Z2D4z8DAyIAE/v37x8zMzMjI+O/fv79///7//58ZDH7//s0EAYxMDAwMf/78+/Xr1+/fvz9//vr7958fP77/+vXz3z8GIPjz58/Pnz9Z2NgYoICRgeE/AyHAxML858+f////MzEy/Pv37+/fv+zsHNzcXEL8fAICfJycnD9//vn16xcbKxMrKysDA8Pfv38ZRsHwBYw/fvxgGAX0BowMDP8ZQOD/t+9//oHBfzBggAJGRkYGBob/DAyMDKjgHyMDKeD/n9//mJmZGRgYGRgYWFiYgeD3798/f/5kZWX99+8fExMTAwPD9+/fP3x4//PnL2Zm5r9//zKQAnh5eYWEhLm4OH+DAQsLCzMz89+/fxlIB4wgwPDv3/9///4xMjKysrKxsDBzcLIyYAGMDAz/GbCB////M0IBAyMDHPz/+4+BiYmRkQEE/v5j+Pv3z79/f////8/CxAgETBDAyPSfgeHfv7////9nYPjPwMDAyMjEAAKMDGDw//8/RkYGGGBkYGBkAIH/DAz/GUCAkQEFMDIw/GcAgf8MIMDIgAoYGRkZYOD///+MjIwMDAxMjEx///0Fgv///zMzM7MwszAggb9//3///vPfv38MDP8/fPj45s2bX3/+MoAAIwPDfwYQ+M/AwMiAG7Cysfz8+fPfv3/s7OysYMDNzc3Pw83FxcnMzMzIyPz3z6+/f/8wMjIwM7MwMTH9/fuXYRQMX8DCMAroBP4zMDAygAAjA8N/BhD4z8DA+OvXbyYmRiYmpn9g8P//fyYQYPz//x8DAyMDpYCRiYmJlZWViYn59+9ff/78+ffvHxMTEwcHx9+/fxkZGVlYWJiYmH7//sXAwPgXDJiZmRlIAV++fOXj42Nm5v77l4mRkZGZmZmJien3799MTEwM2AEjA8N/BgzAyMjIxMTEyMj4//9fRkYmJiZGZmYmVlZWBob/DAyMDOjgPwMOwMjIyMDA8O/fPwYGhv////3/z/D//38GBgZWVtb//xn+/YcCJiZGVlY2RgYGRgbG/yDw7/////8Y/jGCAAMjI+Pfv/8YGZkYQIARCP7//8fAwMDIyAAGjAwMjAxQ8J+B4T8DCDAyoIP/DCDwnwEEGBkYGBkY/jPAACMjw79///7//88EBoyMjH/BgJ2NnYmJiQEG/vz98/8f479///7+/cvBwcHExMjOzsHKygAEf//+//Dhw68/fxlA4D8Dw38GEGBkwAu+ffvGyMjIw8MjLi7Bz8/HyMjIzPCfmZmZgeH/z5+/Gf7/4uBgY2Nj/fXr5+/fv5mZmRkZGRlGwfAFLAyjgC6AkZHp379/////ZwYBlr9//3z79uP79x8srBwMDAz//v1jYGBgZmZmgIL/DAyMDNQATExMf/78YWD4w8Dwn5GR8f///3///mVgYPj//z8LC8v///9///7Nzs7+48cPJiYmBtIBIyMDKyvLz5+/GBkZWVlZf//+zcrKyggGDNgBIwM28P//fwYGhj9//vz/z8DCwvz3799fv36xsrIyMDAykA4YGRkZGP4zMjIxMDAygADj////GcCAEQQYgODfPwYGBkYmhn8MDP8ZwOA/CPxjAAFGJiZmBgZGBjD4D9D/fwwM/xmggJGBgZEBCv4zMPxnAAFGBuzgPwMIMDIwMDIw/GcAgf8MDIwMDAz//zMwggEDA8O/f/8YGBgYGRlZWFj+/vvLgAQYgYCZgYmJhYmJiYGB4e/ff8zMTL9//2NlZeLk5Pjx4wcDAyMDCPxnYGBkAAFGBob/DLgBCwsLAwPD79+/+fh4mYDg/z8Ghv+/f/9mZGRkYWZiYGD48+c3AwgwsrCwMIyC4Q5YGEYBXcD//wyMjIxMTEwMDAy/fv388+fvv3//WVhYGLADRgYo+M9AHfCfgYGRATv4z8DAxMDAyMDwn4F08P//fwYGRgYGxv///zMQBf4zEAD/GagA/jMwMDKAACMDw38Ghv8M6ICRgYGRAQT+M0DBfwYGRgYGRgYQYGQAgf8MUPCfAQoYGRgYGUDgPwPDfwYoYGRgYGRg+M+ADv4zMDAygAAjA8N/BhD4z8DAyEAA/GOAAiYGOGD8x8DwnwEEGBlA4D8DOmBkAAFGBob/DNgBIwPDfwYYYGRkZGb4x/SfkQEEGBkY/jMy/GcAgX8MDIwMDIyMDP8ZGP4zMDD8Z2BiGAXDF7AwjAK6gP///zEzMzMyMv758/vnz19//vxhYGBkYWH+8/c/AwMjA3bwn4FmgJGRkYGB4f///wwMjIyMTIyMDAwMjAzkgP///zMwMPxnIBb8Z2BgZCAB/GMgE/xnYGBkYPjHAAX/GRgYGVDAfwaG/wwM/xlAgJGBgZEBChgZQOA/AxT8ZwABRgYGRgYo+M/A8J8BChgZGBgZsANGBhBgZACB/wwgwMiABfxnYGBkwAL+MYAAEwMYMDIxAMH///8YGJgZGBj//2f4//8PAwpgZGD4z4AdMDIw/GcAA0ZGRqb//5gZ/jMwMPz//5+RkZGBgZGJ8T8DAyMDwz8GBkZGBiD4zzAKRgZgYhgFdAGMjIz/////9+/fnz9///z5++fP3////zEw/GdgYGTAAhgZGP4zUBMwMuAGjDDAQDr4/5/hPxgwEAX+MzAwMlABMDIQBowMDP8ZoOA/AwMjAwIwMoDAfwaG/wwgwMiAAv4zMPxnYPjPAAWMDAyMDAyMDFDwn4HhPwMIMDIwMDEwMDKAwH8GEPjPgAIYGRgYGRj+MzD8YwABRgYQYGRAB4wMRABGRqb/DH8ZGBgYGRkYGRn+////79//////MkABIwPDfwYQ+M+ABfxnYPjPAAZM//8xQgETAwPD////GRn+MoDAfwaG/wwMjAwg8J+B4T/DKBgBgIlhFNAFMDIy/P379+fPn79+/f7//x8TEyMDw/+/f/8xMDAyYAH/GRj+M9ASMDIy/gcDBgZGRkYGJiZGIGAgHfz/z8DA8P///3////9nIAwYGagD/jMQBv8ZQOA/AwgwMqCA/wwM/xkY/jOAACMDAyMDAyMDCvjPwMDIgACMDCDwn4HhHwPDfwYQYGRgYGSAgv8MDP8ZQICRAQEYGUDgPwPDfwYQYGRgYGRgYGRg+M8ABf8ZiAL/GKDgPwgw/GUAg/8gwIAE/jOAwH8GBkYGQoARCpgYgOD/3////zMyMjIw/GdgYGJkAIL/DCDwn2EUjADAxDAK6AL+/v3358+f379///37h4GBgYmJiYGB4d+/fwwM/xmwA0YG2oP///8zMPxnYPjPyMjEQBb4DwL/GBgYGRgY/v//zwAGjIyMDDgBIwP9wH8GBkYG7OA/AwgwMjAwMoDAfwYUwMiAAIwMDP8ZGP4zMPxngAJGBgZGBhD4z8Dwn4HhPwMDIwMKYGRg+M/A8J+B4T8DCDAyMDAygMB/BgRgZIACRgYC4B8DAwMjIyMDA8P///8ZGRkYGP7/+/f/37+/DCjgPwMDIwMDIwMW8J+BgZEBBhgZGZmYmBgZGWDgPwMIMDIy/Gdg+M/A8J+B4T8DAyPDKBgBgIlhFNAF/Pr168+fP//+/WMAgf8MIMDIwMDIMNDg////jIxMjIxMjIyMDOSA/3DAQBgwMjD8Z6AfYGTADv4zMDAyMDAyMDAygMB/Bob/DAz/GVAAIwMU/GcAgf8MIMDIwMDEwMDIAAL/GRj+MzD8Z2BgZIACRgYo+M8AAv8ZQICRgYGRAQT+M4DAfwZ08J+B4T8DAvxjwAYYGRn+///PAAWM//8z/P//nwEB/jMwMDIwMDIw/GfAAhgZGBgZkAAjIyMDAwMjw7////8zMDACAQMDIwMI/GMAAUYGMGD6/49hFAxrwMQwCsgEjAykgN+///z9+5eBgYGRkYGBgfH///8MDIyMjAwMDP8ZsANGBloCRkZGBiTAyMhAHvj//x8DAyMDAyMDUeA/A10BIwN2wMgAAowMIPCPgeE/AwgwMqCA/wwI8J8BBBgZGBgZQOA/A8N/Bob/DCDAyIAA/xkQ4D8DAyMDAyMDAyMDCPxnYPjPwPCfgYGRAQoYGaDgPwMDIwMK+MeABTAyIAAjA8N/Bob/DAjAyMDAyIAO/jNAASMDw38GKPjPyMjIwMDAyMiAAf4zMPxnYGBkAAFGpv//GEbBcAcsDKOAHMDIwPCfgeE/AwMjAwr4/+8/y////5nAgJGR8c+fPz9+/Pj16zcTEzMDHDAygAEjA8O/f4yMDFgBIwMDAyMDJvj/n4EkwPifARtgZGL8/fs3CwvLv3//fv76ycPL/fLlS3Z29n9//zOQAlhYWD9+/CQtLfX///8fP35wcHD8+/fv////jIyMDNjBfwYGRgYMwMTE9O/fP0ZGRgYGhr9//zIxMTEzM//9+5eNlYmBfPCfASdgZGD4z8DwnwEEGBlAgJGB4T8DdsDIAAKMDCDwn4HhPwMUMDKAACMDw38GFPCfgYGRAQQYGUDgPwPDfwYQYGRAgP8M2AELAxr4z8TAwMDIwMjwn4mZiZmBgeHv33/s7MwvXnxhYmL5+58BDBgZQOA/A8N/BgZGBihgZMAA//7+Y2JlZGVhYWRg/PePgYWF7d+/P//+/WNgYPjPwMjAwMTAwMgAAv//MjIxjILhDlgYRgE54D8Dw38GBkYGdMD4/z8DExMTIyPj/////4DB////mZgYGbCA/wyDAjAyMPxjZGRgZGRkIAv8B4F///8zQMD///8ZGRkZsIP/DAyMDNjA////GTDA////GSgF/xkYGBmwgP8MDP8ZQICRgYGRgTBgZACB/wwM/xlAgJEBBBgZQOA/AxT8Z2BgZAABRgYGRgYQ+M8AAv8ZQICRgYGRAQT+M6AARgYGRgaG/wwkgn///jMgwH8GEPjPwMDIgAX8Z2D4z8DAyAADTExMDOjgPwMIMDKAwH8Ghv8MDIwMo2C4AyaGUUBVwMjIwAgGf//+/QUG//79Y2ZmZkAARgYo+M/AwMgw8OA/IyMDIyMTIyPj////GUgGjP////v37z8DUYCRgTjwHwYYKAL/GRgYGbCD/wwgwMjAwMgAAv8ZGP4z4ASMDAz/GRj+MzD8ZwABRgYGRgYGRgaG/wwM/xmg4D8DAyMDFDAygMB/BhD4zwACjAwMjAwg8J8BCv4zQAEjA8N/BkLg/38GRkZGBjBgZGRgYGD88+fP////GRDgPwMDIwMKYGSAgv8MDIwMYMDIyPT//382Nrb//xkg4P///wwgwMjAwMQAAv8ZGP4zMDAyjIIRAJgYRgE54D8DAyMDAyMDBmBiYvr///+fP39+//7958+ff//+/QeBfwwI8J8BChgZGBgZBgj8//+fEQwYGBgYGRmZmZmZmJgYyAH///37++/fv////zMyMjIQAIwMpID///8zUAQYGfABRgYGRgYQ+M/A8J+B4T8DTvCfAQT+M4AAIwMDIwMI/GeAgv8MIMDIgAD/GRj+MzD8Z2D4z8DAyMDAyMDAyMDwn4HhPwPDfwYoYGQAAUYGhv8MRIB///4zMTExMDD8/8/AyMj07x/D79+/GBDgPwMDIwMDIwMDIwMC/Gdg+M8ABYwMUPD///9/7Ozs//79ZWRkZGBg+P//PyMjIwMU/Gdg+M/AwMgwCkYGYGIYBeQARgYGRgaG/wwYgJGR4e/fv79+/fr9+/f///8ZGRkZGBj+/v3HwMDIgAX8Zxh48J+RkYmZmZmJien///8MJIL//////fvv799/DAwMjIyMDAwM////Z8AJ/jPgAP///2cAA0ZGRgYGhv////8DAwZaAUYGBkYGEPjPwPCfAQQYGfCB/wwMjAwMjAwMjAwg8J8BCv4zMDAyQAEjAwL8ZwABRgYGRgYGRgaG/wwg8J+BgZEBBfxnAIH/DITA////GRkZ/oMAAxMT49+//3///sWAAIwMDIwMIPCfAQUwMoAAIwMC/P//n4Gdnf3///+MjIwMDAz///9nAAFGBob/DAz/GRgYGUCAkWEUjADAxDAKyAGMDAz/GbCA/3/+/P3z58/v37///v3LwMDAyMjIwMDw//9/Bob/DOiAkWFAASMYMDAwMjIyAQEjI+P///8ZSAb///37/+/f3////zMwMPz//5+BgYGRkZGBGuD///8MtAKMDCDwn4HhPwMIMDIwMDIwMDLgBIwMIMDIwPCfgeE/A8N/Bob/DCDAyAAFjAwM/xmg4D8DAyMDAyMDAyMDCPxnYPjPwPCfgYGRAQv4z8DAyEAI/P//n5GRAQj+/2dgZGT49+/v799//v//z4AC/jMw/GdAgP8MUMDIwPCfAQwYGRn//2dgZ2f///8/Awr4z8DwnwEEGBkYGBkY/jOMghEAmBhGAfngPwM6YPz58+efP38YGBgYGRn/////79+/////MzIyMmAB/xkY/jMMEPj//z8DDDAyMjAxMTEyMjKQAxj/gQEDAwMjIyMDAfCfAS9gZGRkgIH/YMBAK/CfgeE/A8N/BhBgZGBgZACB/wwEwH8GBGBkQAH/GUDgPwMIMDKAACMDCPxnYPjPAAKMDCDAyIAC/jMwMDIQAf7//88ABv//MzAyMvz79+/Pnz8MCMDIwPCfgeE/AwMjAwIwMjAwMoDAfwaG/wxQwPj//z82Ntb///8zMjIyMDD8//+fAQGYGEDgP8MoGBmAiWEUkAP+MzD8Z2BgZMAAv379/vfvHxMY/P///9+/fwwMDMzMzAxYwH8GBkYGGgJGBryAkZGRAQYYweD///8MJANGBob/////Y4CB////M+AEjAyDCPxnAAEmBgZGBhD4z0AU+M8AAowMUMDIgAD/GRgYGaCAkYHhPwPDfwaG/wwgwMgAAowMDP8ZUAAjAwgwMhAC////Z2Bg+P//PwMI/P//n+Hfv/8MCPCfgeE/AwMjAwpgZGD4zwAC/xkQgPH////MzCz///9ngAFGRkYGEGBkAIH/DKNgxAAmhlFADvj//z/Dv3//GRgYmJiYmJmZ//////37948fPzExMTIwMPz79+////9MTEzMzMyMjIz//v1joBJgxAEYsID/DHjBnz9//v79y8LC8gcMuLi4/v79y0AiYGRk/PXr59ev3xgZGRkYGP78+cPGxvb//38GEgEjIyMDA8P///8ZGBgYwYCBgeH///9///5lYGBgZGT8DwZMYPD//38GSsF/BgZGBgYmBhD4z8Dwn4HhPwNRgJEBBfxngIL/DAyMDCDAyMDAyMDwnwEE/jOAACMDAyMDAyMDw38GLICRgeE/AwpgZMAATExMDGDAzMzAyMj45s1bDg52JiYmBij4z8DAyAACjAwI8J+B4T8DFDAygAELCzMPD/fPnz+ZmZl//vzJzMzMxMT09+9fBhBgZGD4z8Dwn2EUjBjAwjAKSAb/GRgY////z8TExMjI8P///z9g8P//fyYmxv8M/xkYGBmIAowMDIwMDP8ZSAaMDAz/GSgDjIyMDEiAEQYYSAT///9jYGD4////v3//GBkZGRgY/v//z0A98P//fwYk8P//fwbqAEYGKPjPwPCfAQQYGSgCjAwgwMjA8J8BBP4zgAAjAwgwMoDAfwbs4D8DOvjPgAEYGRkZwODfPwZmZoafP3/++/f3////DAyMDAz/GRgYGUCAkYHhPwMWwMjAwMjA8J+BgeHfv7/MzCyMjEyMjAyMjIz///9nYGBgZGRkAIH/DAz/GUbBSAJMDKOAZMDIwMDACAIMjIyMf//+/QUG//79Y2ZmZiABMDIw/GcgB/xnIAr8Z8AN/v//z8jIyMDA8B8MGBkZmZmZmZiYGEgE////Y2Bg/AsGjGDw79+/////M1AJ/AcDBgYGRkZGBioDRgaG/wwM/xlAgJEBBBgZyAeMDAyMDAz/GUDgPwMIMDKAACMDCPxnYPjPgB38ZyACMDEx/f79l5GR8f9/hv//Gb5///bv3/9///4xMPxnYGBkAAFGBob/DCjgPwMDIwMIMDIw/Gdg+M/AwPDv3z9WVjYmJkYgYGJi+vfvHwMDAyMjIwMCMDKMghEDmBhGATmAkYmJ8f//f3/+/Pn9+/efP3/+/fv3HwT+MTAwMhAL/jPQFjAygAAjAzbACAP///9nYGBgYmJiBgMGkgEjIyPT379///z5w8jIwMjI+O/fP0ZGRgYqshYAYAAAIABJREFUgX///jEwMDAyMjKAwf///xkYGBgZGRmoAP4zMPxnAAFGBhBgZGD4z0AR+M8AAv8ZQICRAQQYGUDgPwPDfwYGRgZiwX8GDMDExPDv3z8mJiZGRoa/fxl+/vzx//9/BhBgZAABRgaG/wwM/xlQACMDAyMDFPxnYGBkYGD4/5+Bg4ODiYmJkZGRiYnp379/DAwMjIyMDCDwn4GBkYGBkWEUjBjAxDAKSAaMDAz/GRkZ/v799+vXr9+///z//5+RkZGBgeHv338MDIwMNAf/GYgFjAwM/xmwgf///zMyMjIwMPz//5+BgYGJiYkZBJgYSAeMjAx//vz59esXAwMjAwPjv3//GBkZGagE/v379///fwYGBkZGRgYqg/8MIMDIwMDIwMDIwPCfgSLwnwEE/jMwMDIwMDIwMDKAwH8Ghv8MDP8ZGBgZcAJGBhTwn4GBkQEbYAQDJiaG79+//fv3n5GRiZGRkQEK/jMw/GfAAv4zgMB/BhhgYmLm5ORgYGD4//8/ExPTv3//GBkZGaCAkYGBkYHhP8MoGDGAiWEUkAz+MzD8/wMGv3//+fv3DwMDAyMjIwMDw////xkY/jPQHDAyEAUYGRj+M+AAjGDAwMDwHwyYmJiYmZmZmJgZGBgZUMB/BryAkZEJCP78+fP7928GEPgPBIyMjAxUAv/+/fv//z8DDPwHAwaqAUYGBkYGEPjPQCn4zwACjAwgwMjA8J8BCv4zMDAyEAv+MzAwMjAwMmCA//8ZWFhY/v37x8jI8OnTJ0ZGJkZGBkZGRgYGRgYQ+M8AAowMKICRAQr+MzAwMjAwMjAwsLKycnCw/////9+/f4yMjAxg8O/fP4ZRMCIBE8MoIBn8Z2Bg+Pnz158/fxkY/jMyMv7////fv3////9nZGRiGETgPwMI/GfABv7//8/AwMDIyPj//38GBgYmJiZmZmYmJiYGhv8MKICRAS9gZGRgZGT4+/fv79+///9nAIL///8zMTExUAn8BwNGBkYgYKAyYGRgYGRg+M/A8J+B4T8Dw38G8sF/BgZGBihgZGD4z4AAjAwkAEYGBkYGbODPn79MTAx///5lYGD4+PETMzMzAxT8Z2D4z8DAyMDAyMDAyIAC/jMw/GcAAUYGBkYGhv8MDAysrCwcHBz/////+/cvIyMjAwMDIyPj////GaDgPwPDf4ZRMGIAE8MoIAcw/vr1+9+/v0wgwPj///9///4xMDAwMzMxMPxnGFyAkYGBkQEDMIIBAxJgBAEmBnTAyIAXMIIA079///7+/fv//z8Ghv8MDAyMjIwMDIwM1AD///9noDn4z8DAyMDAyEA+YGSAAkYGhv8MIPCfgXzwn4HhPwMq+PPnDwMDw9+/fxkYGL59+87ExPgfDBgY/jMwMDKAACMDw38GdMDIgAqYmZmYmBj/////798/RkZGBjD4//8/AxT8Z2BgZBgFIwawMIwCvODff2YGBgZGRkZmZmYGBoY/f/78BIFfTEys/xkY/v77z8DAwsjEwMgAAn///f/HyMgwEICRkZEBG/j/n4GB4T8DBvj//z8jI+P///+ZmZn/////69evv3//CgkJPvv+/e/ffywsLAwMDL9//2ZiYmZlZfnz5w8DDvD//z9GRiZWVtavX7/+AwEGVlbWv3//MjD8Z6AG+PuH8d9fpv//Gf7/Z2T4z8LI+J+RgfH///8MEMD4j4Ei8J+B4T8DAyMDCDAyMPxnIB8wMjD8Z2D4zwAC/xkYGBnIAYz/GP4zMPxnYGBkgANGBiBg5WD/8fsPBxfHh8/ffvz+ycXK+evvHw4Ojt+//jGAACMDw38Ghv8MSICFlen3779///5hY2NnZGT4/fsnIyOTuLjY589f2NhYOTjY/vz5xcDw798/BiYmJgYoYGYYBSMJMDGMAkKACQz+////58+f379///v3n5mZiYHhPwPDfwYGRgYUwMgwuAAjA8N/BmzgPxgwwAAjFDAwMjIxMDD8//+fAQQYGRkZ/oMBAw7w9+8/Rkamf//+/f///8eP74yMjP///2egNvj/n4E24D8DAyMDCDAyMPxnIB8wMjD8Z4CC/wwMjAwkA0YGBkYGhv8MDP8ZsIH/YMDAwPD9+3cGBoa/f/8xMTH/+fOHAQQYGRj+M4DAfwYY+P//PwMDIwMDAyMjIwPD/////zEwMDKBADMTExMjIyMDA8P///8ZRsHIBkwMowAvYISBv3///vr16/fv3////2NiYmIAAUYGEGBkQAGMDIMFMDIw/GcAgf8M2MB/MGCAASYQYGZkZPz///+/f/8YGBgYGRkYGP4zMDD8//+fAQf49+8fIyPD379/GRkZv3z5ygAG////Z2D4z0Al8B8EGICAkZEBAhgZGRmoAxgZoOA/A5mAkQEE/jNAwX8GBkYGEGBkIBn8Z2D4zwACjAwMjAwI8J8BBv7++//p0ydGRoY/f/4wMzP9+fOHgYGRgeE/Awj8Z2BgZIACRgYGhn///jEw/GdkZGRg+P/v3z8GBkYWFhZWVlYmJkYGBob///8zgAEjGDCMghEJmBhGAV7AxMT0////P3/+/P79+8+fP//+/fsPAv8YGBgZGBgZQOA/AwIwMjD8Zxgs4D8DCPxnYGBkwAD///9nAIP///8zwgATExMrKxsjI+P///8ZGBgYGRkZGBj////PgBv8/8/AxMT0//9/Jiamr1+//f//n4GBgZGRkYGBkYEagJGR8R8I/GeAgf///zMMFsDIwPCfAQr+M4AAIwMU/GcgATAyMPxnYPjPAAKMDAyMDAz/GRCAkYGBEQJ+/fr19etXJibmf//+s7Cw/Pv3j4HhPwPDfwYQYGRgYGSAgv8QwMDwn5GRkYGB4d8/BkZGRnZ2dmZmJmZmJgYkwMjIyDAKRipgYhgFUMDIgA0wMjL8/fv358+fv3///v//PyMj4/////79+8/AwMjA8J8BHfxnGFzgPwMDIwM2wMjIyAAD////Z2BgYAQBJjY2ViYmpv9gwMjIQBAwMzP9//+fiYmJkZHx9+9fv379ZGBgYGRkZGBgZKAS+AcG//8zMDIyDDLwnwEK/jMwMDKAACMDyYCRgeE/A8N/BhBgZGBgZGD4z8DwnwEF/GdgYGBkZPz69euvX7+YmVkYGP4zggATA8N/BgT4zwAF/xkYGP7//8/AwMDExMTAwPjv3z9mZiYuLi4mJkYGBkYGBob///8zMDAwMjIyjIIRDJgYRgEU/GfABv78+fsHDP7+/cvAwMDIyMjAwPjv33+GoQEYGXAARjBgQAKMIMDAwcHOwsLCAAWMDAyMDAwMjIyMDDgAMzPz79+/mZiYGBkZGRgYvn37/u/fPwYo+M+AAhgZSAeMjIz/////9+8fAwMDIyMDEPz//59hEIH/DCDAyAAF/xlIA4wMDP8ZGP4zgAAjAwMjAwj8Z0ABjAww8OnTp3///jEyMjAxMf79+5eJiZEBBBgZGBgZUAEjI+P///8ZGBiBgIGB8f//fywszNzc3AwgwPj//38GMGBkZGRgYPj//z/DKBiRgIlhFOAFP3/+/PPnDwMDAyMj4//////9+8fAwMDExMTA8J+B4T8DOvjPQB3wnwEKGBloAxjBgAEDcHBwsrCwMDIy/v//n4GBkYHhPwPDf0ZGRgYcgJmZ+efPn0xMTP///2diYvz69evfv3///2dgYPjPwMDIgAL+M5AF/v///+/fPwYGBkZGhkEG/jMwMDKAACMDAyMDyYCRgeE/AxQwMjAwMoDAPwYQYGRgYGSAgv8MDP//gcHHjx8ZGRn////PwMD4589fRkYGBgZGBgZGBob/DCDwnwEKGIGAgYHh/38GIPj//x8Dw38WFlYuLq7//xn+/fv3HwwYGRkZwOD///8Mo2BEAiaGUQAF/xmwgV+/fv/7948JDP7////v3z8GBkYmJkYGhv8MDIwMIMDIgACMDNQBjAxQ8J+BNoCRkZGBgYGRkZEBBv7//8/A8J+FhYWJiYkBAf4zMDAy4AZMTEy/f/9mZGT8//8/ExPzjx8//4HAXwaG/wwogJGBXPD//3+GQQoYGRDgPwMI/GcgFjAyMPxnAIH/DAyMDAyMDCDwnwEEGBkYGBkY/jNAwX8GBsb/////+/fv+/fvTExM////Z2Rk/PPnNyMjIwMDIwPDfwYoYGSAAkYgYACB/wwwwMzMzMrK+v8/w/////7//8cABoyMjAwMDP///2cYBSMSMDGMAhD4//8/w79///7//88EBv/////+/fvHj58ZGRn+////9+/ff//+MTIyMjExMTD8//fvLwMDIwMU/GcYxIARB/j3799/MGBAAv//MzAxMbOxsTExMf3//5+B4f/fv39///7NyMjIgAP8/PmTi4vr////zMzMf/78+ffv74cPH/79+/f/P8Pfv//+/Pnz//9/RhBgYGD4DwQMpIO/f//++vXr9+8///4xMDIyMjAw/P//n2GwAEYGEPjPwPCfAQQYGYgF/xkY/jMw/GdgYGRgYGQAgf8MDP+ZmJgZGZmYmBiZmJgYGRn/gwEDAwMTE9Pjx48ZGBj+///PwMDw//9/Zmbmv3//MYDAfwYM8Pv3LyYQYPzz5w8zM9O/f//FxMT////PyMjAxMTIxMTMyMjIwMDw//9/BgYGJiYmhlEwIgETwygAAcb//xmYmJiYmZn/////58+f379/////n4mJARv4z8DAyAACjAw0B/8Z6AoYGRj+s4IBAwPD////mJiYmZiY////z4ADMILBfzBgZGRiZGT8+/fvz58/mJiYmZgYmZiYGBgY/v//zwACjEDAQAH4/5/h////DAMM/jMgACMDw38GEPjPwMDIQBRgZICC/wwgwMjAwMgAAv8ZGP4zMDD++/cfBv79//+fgYGBkZGJkZHx69evv3//ZoABRjBgYmJmYPjPgAX8Z2JiZmJiYmBgYGZm/v37DycnFysrCyMjIwPDf4ZRMApggIlhFIABIxgwMDD8+/fvFxj8+/ePmZmZAQtgZAABRgaG/wwg8J+BhoCRgYGRgb6AnZ2dg4ODkZHx/38GJiZmZmam////M+AATExMDAwM/8GAkZGBkZHxz58/3759Z2RkZGJiZGJiYmBg+A8C/xjIAv///2dkZGRgYPj379///wxAwMjIyDBg4D8DAyMDCDAyMDAyMPxnAIH/DAjAyIATMDIwMDIw/GcAgf8MIMDIwMDIAAL/GRj+MzAwMjAw/vv37///v/////v37/+/f/8YGBgYQY");
            stringBuilder.append("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BiYvoHBoyMDGxs7IKCgl++fPn27du/f/8YYICRkfH///8M2MC/f/+YmZkZwODfv38MMPD7928ODg5WVtbfv39//Pjxy5cvv379EhQU/Pv3LysrKwMDAyMjIwMDw////xkZGRkYGJmYmP7DAAMSYGRk/PeP4ffvv////2dhYWFmZmYAAUYGhn8MDIwMQPCfiQEIGP8xQAETA2mAiQEKGBkY/jMwMDJAAeP//4z//zMyAQEjAwPD/z9///369evv3z+vXr19/frN379/OTjYuLg4fv/+8/PnTyYmZob/LAwMTP////v//z8DCDAyQAEjAwMzA8M/BoZ/DAz/GBgYGRgYGBmZGRn/MTD8BwGGfyysLLx83MLCgpycnExMLP/+/WUAg3///jEyMjIzM///z8jA8J+BZPCfgSjAyMDwn2EUDH3AwjDEwe/fv5mYmBgZGRkYGP7+/cvAwMAMAkx//vxjGDDwn4GBkWF4AWZm5v9gwMTExMDA8O/fPwYGBiYmFl5e3j9//nz//v3///8MYMAIBv///2fABv7+/csEA////2diYmIEA1ZW1t+/f//48YORkZGdnR0gJiamT58+vXv3TlpamoGBgQkMGBDgPyMj438YYGRk/P//PwMYMLMw/fv37/fv3///szAyMjMx/WdiYmJg+M/AwMzA8I8BDv4zMVAK/jMwMDJAASMjAxAw/v//lwEEGP/8/fft2/dv3749ePDw////TExM7Oys//79+/nzJyMjExsbx6+ff5mZmZiYGBgY/oMBEwMDIwPDfwYGRgYGJgaG/wwg8I+BgZGBgZGBgZEBCBj/MTD8Z2BkZGJiYWNjExTkFxcX/vfr779//xgY/jMwMPz////fv39MTIwsLKx///5joBVgZGD4zzAKhgVg/PHjB8NQAIyMjP/BgBEM/v379+vXrz9//vxnYGHAAv4zMDAykAL+///PQB3wn4GBkYFo8P//fwZSwD9GhsEB/jMwMDIwMDIyMP79+/fz58/v37//+fMnKysrExPT379/GRkZmZiYGBgY/v79y8jIyMzM/P//v1+/frOwsDCQAhgZGdnZ2bnAgJ2dnYmJ6T8Y/Pnzh4mJiZmZmYmJiZGR8f/////+/fv//z8LKzMDA8O/f//+///PxMTEwsLCzs7KwsLMyMDwn4Hh//9/////Z2BgYIQABsb///4ywMD///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9MTEwsLCz/QODPv3//mJgZWVhYX716xcvL/f//f0am/xwcHIyM/xkZGRmA4P9/BgZGhlFAJcD47ftvRjBgYGD49+/fXzD49+/f////GQYT+P//PwM6+M/AwMjAwMjA8J+BZuDvfwasgIWF+devP////2djY2VkZPj9+8+/f/+ZQYCJkZHh79+/X79+/fjx89evX//+/cvExMjExMiAAIwMDEwMIPCPgeE/A8N/BgZGBgZGBgZGBij4/+/fPwaG/wwMDIyMTIyMjAwMjP////v//z8bG9s/MPj79+////8ZGRmZmJgYGRn//fvHyMjIxMTEyMjIAAb///9nYGBgZGT8//8/AwPDfxhgYGD4//8/MzMzA1XAv38MDAyMjIwMDAyMIMDAwPCfgYHx37//DAz/GUDgH8MooBQwMjD8Z6Al+P//PwMYMDIyMjAwMDIyMjAwMDIy/vvHAASMMPD///9///79/fuXiYmJgYGBkZGRCQz+////79+/v3//MrGy/Pv37////wwMDExgwMjA9P///3///jGAABMDOvjHgA0wMjL+//+fgYGBg4NDTExMRESYkZHh27cfnBwM////ZwQDhn////79y8jIyMzM+u/fP8b/DMiAiQEE/jIyjAI8gPHHz78MYPD///9///79BYN///4xDDLw//9/BiyAkYHhPwMtwd//DNjAfyYm5n///jMw/GdiYvz///+/fwyMjIzMzEwsLMw/fvz4/PnL589fvn//8f//PyYmBmZm5r9//zJAARMDAyMDCPxjYPjHAAKMDAyMDAyMDFDwn4HhPzMz838QYPj/n4GRkZGB4T8DGPz+/ZsJBhgZGRkYGP6DATMz879///6CAQMDAyMjIxMTEyMj479//xgYGBhhgImJiYGBgZGR8e/fvwzUAP///mViYmJkZGQAgf9AwAACjP///2MAgX8Mo4BSwMjA8J8BBP4zMDAy0AawsLAwMDD8////379///////fv3////xkYGDg4uP7+/fvv37////8zMjIyMTExMjIyMDAwMzP/+/fv79+///79YwQDBjD4y/CfkZGRiYmJkZGRgYHh////f//8AwJmZmYGEGBiQAf/GLABRkbG/2DAyMjIzc0tJCTEz8/Pzs76+9cXJiYmRjBgYmAEgn8gwMAIBP8Z0AATA8NfRoZRgAewMDIy/geDv3///vv37+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8zM7MwMTH++/fv//9/TEyMDDQE/4GAAQT+c3JyMTIyMjEx/f37l42N6e/fvwzYACMjIwMDw////xlAgPH///8MDP8YGBh///7NxsbCxAgCDCMYsDCMMPD//39GRkYGBob///8zgMH//////PnDwMDwHwwYGBnggJGRkeE/Ay7w//9/RkZGZjBgZGRkAIH/DAz/GRj+MzAwMiAAIwPDfwaG/wwMjAwUg79///7//5+BgeH///+MjIwMDEz/////+/cvIyMjAzbAycn558+ff//+MTExMTAw/P///y8YsLCwMIyCUQADv379+f//PyMjIzMzCxPTf0ZGRiYmJkZGhn8M/xlwg7///v/9+5edjfXf//9//vxhYWFhAIH/DFQGjAwM/xnAgJGRiQEE/rOysLCysv4HAwbcgJGR8f///4yMjP///2cAgf9AwMDA8OvXL05OdmYWFkZGRgYGhv///zOMSMDCMLIBIyPjv3///vz58///fwZUwMjIyIAb/P//n4GBgYmJiYWFhZmZmYGB4f///0xMTAwM/xkYGBlQwH8Ghv8MDIwM1AA8PDw/f/788+cPExMzMzMTAwPDv3//mJmZGXCAr1+/MjAw/Pv3l4GBkYWFhZWVlYWF5e/fv////2cYBaMABlhYWJiYGIDg9+9/f//+Z2VlZmFhAIL//xkZsAEWFhYGBoZ///4xMjIyMPz//5+BiYmJhZnp/7+/DNQH/xlggJGRiYGBgYmJmYGBgYOD4/v370xMTAyEwP///xmg4D8DAyMQ/P79+////0xMTP/+Mfz//58BDP7//8/AwMgwkgALwwgD////Z2BgYGRk/PfvHwMY/P///+/fvwwMDP///2dABYyMjP8ZsIP///8zMjIyMzOzsLAwMjL++/ePgYGBkZHh/39GBlqCN2/evH379suXL6wgwPL37z8gYGFh+ffvHwM28P//fxYWln///v39+5ebm1tYWJiTk/Pv379MTEwMo2AUwMC/f/+YmJi+fPn2+PGTDx8+MjOzMDIy/Pz5k5mNmQEHYGFh+fHjByMjIycnx7dv39nY2JSVlQX5eRloCZiYGP/8/cvMzPzvPwMnJ+f379+ZmZn////PgAP8//+fARUwMjIxMPz/8+fPv3//GMGAYQQDJoaRDRgZGf+DAQMqYGRkZMAL/v//zwgGTExMjIyM/8GAkZGJAQQYGdABIwMDIwM1AA8PDzMz8z8Q+Pv/P8Pfv3///fvHyMj4Hwf4+/fv//////z58+PHj58/fzIyMrKysrKwsDCMglGABBgZGRkYGBgZGX/9+v3z56////+xsrKysbExMDAxMDAxMDAxMDAxMDAxMDAxMDAxMDAxMDAxMjIzMjIzMjL/+8f4589/VlZ2IUEBBob/DLQETEyMf//+Y2Rg+P//Pysr6////5mYmP7//8+AG/z//58BBhgZmRgY/jMyMv77948BFTAyMjKMPMDEQCXASCJgGCDAyMjIzMz8//9/FhaW//////37l42N7devX////2dAAv/B4N+/fww4ABMY/Pz5k4uL6+/fv//+/WNkZPz//z8DCPxnQAeMDAz/GagEvn//zsbGxsrK9vv3byYw+PPnDwMOwMzM/PfvXyYmZk5Ozt+/f7Oxsf369evv378Mo2AUoIL//xlYWVl///7DycnByMj469cvBgYGRhzg////DAwMjIyMLCwsf//+4+Li/Pnz57///xkYGBloCX79+sXOxsrAwPDnzx9eXt6/f/8y4AX///9nQAL//zP8////379/P378YGVl/QMGTExMDAwMzMzM//79YxhhgIlh5IH/YMCABP7//89ALmBkZGQgDP4zDDD4zzAKRgFR4D8DyeA/A8N/BhBgZKA5YGQAgf8MDAyMYMBAGvjPAAb/wYBhxAMmhlHAwPD//38GsgAjIyMDAwMjGDAwMPz//5+BfMDIQBpgZCATMDKMglGAD/xnGKyAkZHpPwPDfwYGRjBgYGD4//8/A+ng////DKjg////jIyMDCMMsDCMSPD//38GBgZGMPj///+/f/8YyAWMYMBAKWBkYPjPQBr4z0AOYGRg+M8wCkYBTvCfgYGRAQ7+MzJgBf8ZGf4zMvxnZPjPyPD/PwMDE8P/fwz/GWgNGBkZGRj+MzAwAgETExMjIyMDaeA/Axj8+/fv////DAwMjIyM/8GAkZFhBAImhhEP/v///+/fPwayACMSYKAI/GegE/jPMApGAT7AyMDAyEAaYGRgYGSAgv8MtASMjAz//zP+/8/AyMjIxMTEAAb///9nIBYwMoDBv3///v//z8jIyDCyARPDCAOMjIz/YYCRkZGBgeH//////v1jIBcwMjIyDFXAyDAKRgEVACMDw38GKGBkoCVgZGT4DwaMjIxMTEyMjIz///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i4uL5///7371+GUUAWYGEYBeQCJiam////f/v27e/fvywsLKysrExMTIyMjP+RAAMY/P//n2EUjIJRQDT49/8fEDAwMDAxMTEzMzMyMDIwMPz7/4+VhZWBgeHb91///v378ePHnz9/GBkZmZiY/v79yzAKSAcsDKOALMDMzMLA8P/bt29v3rz58eMHFxcXLy8vMzMzEypgYGD4DwYMo2AUjAjAxEAaYGLABv7+/cfAwMjIyMTMzMTIAAK/fv/5/fs3Axi8fPn6x48fv379+vHjBzMz8////xlGAVmAhWEUkAW+f//Gzs7OyMj458+fb9++/fnz5+fPn3/+/OHh4WFlZWVnZ2djY2NmZmZkZPz379////+ZmZkZRsEoGAXEASYmJgYw+P+f4c/fv9++ffv8+fO3b99ev37Nzc399et3FhYWZmZmVlbW//////r1i4WFhWEUkA5YGBkZGbCB////MwwEYGRkZBgKgJWV9d+/f6ysrD9//mRnZ2dgYPj16xcDA8OnT58YGBgYGRmZmZnZ2dm5uLg4OTnZ2NgYwIARDP4jASYmJgYYYGRkZGBgYASDv3///ocBRkZGJhj48+fP////GWCAkZHx////jIyM////ZxgFo4BegImJ6e/fv4yMjExMTL9+/WIGg3//GJiZGIDgPxgwMDAwMjIyMzMzMjAyMDD8Z/gPBIxAwMDIwMDw7/8/IGBgZIAAJiZGRgaG/wwM//79/wcGP378+PLly6dPn75///779+////8zMDCwsrL++vWLlZWVgYHh379/DAwMjIyMLCwsDKOALMDCMAqoCpiYmP6DwZ8/f/7+/fvjxw8mMODh4WFiYmIBA1ZWVmZmZhYWFiYmpm/fvjEyMjIxMTEyMv5HAiwsLIww8B8M/v79++fPHyYmJoZRMAoGKfjHwMDAyMjIxMT0////f2Dw588fBgYGVlbW//////v37////0xMTIww8OfvX0ZGRiYmpn///v/9+/fnz5/fv3//9evXhw8f/v379wcM/v//z8jIyMzMzMTE9OfPH4ZRQD3AwjAKqAr+/v3LyMjIwMDAyMj4////P3/+/AeDHz9+MDMzs7CwsLKysrOzs7GxsbKyMjExsbCwMIEBIyPj/////4HB//////79y8DAwMTExMjIyAAGTExMDAwM////ZxgFo2CQAqZfP38yMjIyMTExAwETCwszAwT8/fuf4f9/ZiZmRkZGJiYGIPj/n+H/fwY2Voafv35//vz5y5cv3759+/79+8+fP//+/cvIyMgABoyMjExMTAwMDP/////37x/DKKAqYGEYBTQATExMjIyMDGDwHwx+//799+/f379///z589u3bywsLMzMzExMTPz8/ExMTMzMzCwsLMzMzExMTCwsLAwMDH/+/Pn///+/f//+///PCAZMYPD371+GUTAKBivg5GRnYGD4+/f/v3///v79zwgGDAwMLCxMDAyMDGDw9+//X79+/fjx49evX+8/ff7169ePHz9+/fr1//9/RkZGZmZmNjZWRkZGBjD4//8/AwPDPxD4z8Dwn4mJYRRQEbAwjAKqAhYWlv9g8O/fv/9gwMDA8P//fzY2tv8w8Pfv33///jEyMjIwMPz48YOJiYmFhYWVlZWDg4OdnZ2NjY2FhYWZmZmBgeE/EvgHBoyMjAyjYBQMVvD/P8O/f////fvHyMjIxMTEwMDw////f//+/fz5Fwh+gcGPHz++f//+7du3379/f/n+g4mJiYWFhZWVlZmZmYGB4d+/f3///mVkZPz//z8DEmBiYmIAgX8MBAAjwyggGrAwjAKqgv9g8O/fv/9gwMDAwMjIyMTE9O/fPwYYYGJiYmBgYGRkZGBg+AsGv3///vHjx7dv31hZWVlYWJiZmTk4OFhYWNjY2FhZWVlYWBgYGP6Bwf///xlGwSgYrODPn78MDAyMjIzMzEyMjAx//vz7+fPnr1+/Pn369OvXrx8/fvz8+fPPnz///v1jAAN+fv7///8zMDD8////Hxj8+fPn79+/bGxsDAwM/8GAEQwYGBgYGRn//2cgBP4zMDAyYAf/GRgYGUYBEmBhGAVUBX///mUAAyYmJkYYYGBg+PXrFwMDAyMYMIDBfzBgY2P7////PzD48+fP79+/GRkZGRgYWMCAjY2NHQxYWFiYmJgYGRmZmJgYRsEoGKyAlZX53z+Gnz9/fv784+fPn9++ffv69ev379+ZmZn//v3758+ff//+MTIysrCwMDMzMzEx/f337w8Y/P//n4mJiZWVlZOTk5mZ+devXwxg8B8VMDIykAIYGRj+M0DBfwYGRoZRgApYGEYBVQETExMDAwMjIyMDA8P//////fv3HwxYWFgYGBgYGRkZGBj+g8G/f//+////8+dPRkZGBgYGRkZGJiYmRkZGBjD49+/fz58/v3//zsjIyMLCwg4GrKysfHx8DKNgFAxS8P/581c/fvz4+vXrz58///379////39gwMjIyMDAwMrKyggG//////fv3+/fv5nZ2JmYmFhZWRkZGRkYGP7////z589///4xMTExMjIyMTExgsG/f//+gwEjIwMp4D8DAjAyMPxnYGBkYPjPMApggIUBB2BkZGTABv7//88wtAHT//8MTEyMQPDnzx9mZmZGRsa/v3+xsLAwgMH/f/8ZGP4xwMA/BmYGJMAIBgwMDP///2fABv7//8fAwPD//38GGGAEg////zMwMPz//58BBpiYmBhQwX8wYEACTExMDAwMf//+/QYGDAwMr169YgSDf//+MTEx/f//n5GR8f///ww4wL9//1hZWf/+/fvnzx9WVlZmZuY/f/78BwNGMGBgYGBkZPz//z/DKBiC4B8DaYCJ6e9/hv///zPAABMjIyMDAwMjI9OPX7+ZmVl///3HxcX99etXdnbOf//+Mfz9zYAD/P//n4mJ6e/fv8zMzAwMDP/+/Tt37gIDCmBiAAImZiYmhr//GUDgPwPDfwYwYGRgYGZkZv739z8DCDD+/88ABoxMjMxMzMwMYPD/H8N/hv8MIMDIyMDIyMjA8J+JARtgZGRkYGD4DwYMDP8ZYICFhe3//////v37DwKM/xkZmJiYGJkY/vz9++vvH2Zm5p+/f3FwcHz//YORkZGVlYXh93+GkQRYGEYe+P//PwMDAyMjIwsLCzMzMyMjIysr679//xgYGBgZGZmYmBjA4P///wwMDEyMTAxg8P//fwYw+P//P8PQAf9hgJGRkQkMWFlZGRkZf/78ycDA8P//fwYGhv8wwMDAwMzMzDAKhjVgZGBiYPwPBowMDP/////HwMDAwszEwsLCwMDw79+/nz9//v79m4GB6e/fv6yszAwkACYGhn8MAwH+///PAAaMjEwMDP8ZGRkZQOD/v3//GMCAkZEBCP7////37z+Gf/+ZmZlZwOD//78MDAyMjIwMDAz//v1jYmBkGEmAhWGEAUZGRgYGhn///v3//5+JiYmBgeHv378MDAxMTEyMYMDAwPD///9///79////379/TCwsDAwMjGDwHwYYGBgYGRkZhgJgYWFhZGRkYGD4////nz9/fv369e/fPxYWFkZGRgYGBkZGRgYwYGRk/P");
            stringBuilder.append("//P8MoGO7g77//DAz/GBkZGRgYmJiYGBgYGBmYGRgY/jMwMDMxMjAwsLCwMDIysrOzs7Fx/Pv378+fXwwkgH8MAwT+///PwMDACAIMjIxMDAwM////Y2Bg/Pv3LyMUMDAyMjEw/Pv/n4mB8T8QMDAwMDExAsG/f/8YGRmZmJj+/fvHxMDMMJIAC8MIA0xMTP/////z58+/f/8YGBj+/Pnz+/dvBgaG/2DAgASYwODPv3+MjIz///9nZGRkGIKAiYnp////DAwMTExMjIyMf//+/f//PyMj4////xkZGRnAgJGRkYGBgZGRkYGB4f///wyjYPiC////MTIy/v//n5GR+f///wwMDP////v/n/Hv3z+srKx///7/9+/f79+/GRkZTjLzkwAAIABJREFUf//++f8/I8MQBP////v/nwEI/v//x8LC+v//fwaGf////2NgYPj//x8DAwMjI8P///9///7NzMz8////v3//MjEzsrCw/Pz5k2GEARaGkQcYGRn/gwETE9Pfv38ZGBg4ODi+f//+HwYYGRmZwICRkfH339///zMwMjL+/8/AyMjIwMDAyMgABv8ZhgL48+cPAwPD////WVlZmZmZWVlZ////z8nJ+eXLF0ZGRgYw+P//PwMDw////xkYGBgZGRlGwfAFzMzMDAxMDGDw////f38Z/v378/8/Iwc7GwMQMDNycnL++PGDgYHhz58/jIyMTExMDCSAfwwMTAy0Bf8YsAFGRgYw+A8GDEDw//9/BgZGBoZ/DAz//4EBA8M/RiBgYmBgYOTm5mRgYPj//y8jI+P///8ZGBgYGRgZRh5gYRhh4O/fv8zMzAwMDIyMjCwsLP///2dlZRUUFOTi4vr79+9vGPj379/v378ZGBiYmJj////PwMDw//9/BgYGRjBgYGD4//8/wxAB////Z2RkZGJi+vfv37dv337//v33718WFhYGBgZGRkYGGPj//z8DA8P///8ZRsHwBf/+/Wdk/M/EyMTIwMjAyMTE8v//f0YGBoYvX78xMjL/+fOHhYWFjY2NkZHxx48fbGxsv3//ZiABMDEMEGBkZGRgYPj//9///wz///9nhIGf374zMjIyszCysbCwsnKwsbGwsbExMzNzcrKzs7AyMTAws7D8/fv3399/TKwMjP/+MzAxjCjAwjDCwL9//1hYWBgZGRkYGBgZGf///8/ExMTNzc3Dw/Pv37/fv3//+vXr58+fv379+v3799+/fxmYmP+Bwd+/fxkYGP7//88IBv///2cYCoCZmfnv378MDAz//v379evX+/fvv379ysXFxcvLy8jIyMzMzMLCwgwGjGDw//9/hlEwlAATAyng/z+m/wwMf////f///9+/f//8+ffnz59///49ffr8379/DAwMP77/ZGRkZGJi+vHjBzMzM8MQAYyMjP////v/nwEIGBmZmJmZwICRiYGBhYWFAwQ4AePkZAcCNjY2JiYGJiYmRkbGP39+s7Oz//v37z8YMDIyMowwwMIw8gATExMDA8P//////fv3588fZjBgYGBgYWFhZWXl5OT89+/fHzD4+/fvuw8f//79++fPn//////7949hqIH/////+/ePiYmJkZHx////f/78+fnzJxMT05cvX5iZmdnY2NjZ2Tk4ONjY2FhZWZnAgGEUDF/AwsLy58+f379/f/v24wsYfP/+/devXxwcXL9//2ZkZGRiYmJhYWEEA2Zm5n///jGQABgZGP4zDBhgZGD4z8DAyMTEyMTExMLCzMzMIiYiwsLCwg4GrKysTEwMQPD//39GRsafP3/9/vOLlZWVgYHh379/DAxMTEwsDP8ZRhRgfP/hEwM1wP///xkGAvz//58BN2BkZGSAAUZGRgYGhv//GRlIAX/+/f/379/fv39//fr148eP79+///z588+fP8zMzIxgwMDA8B8JMDMz/////9+/f////2dkZGSCgd+/fzMgAUYY+PfvH8NAACYmpn9g8P//fyYmJmYYEBISYmZmZgEDJiYmRiaG/2Dw7ds3Tk52bm5uNlYWBgaGf/8Z/v37x8DA8P/vb2ZmZiYmJkZGRgYGhv9gwMjIyAAGjIyMDAwM/////wcDrKysDKMAN/j9+zcTDDAyMjIwMPz//58BDP7//88IBgwMDP/////379/fv38ZmFgYGBgYGRmZmJgYGRn+/2f4CwYsLCwMYMDIyMjAwPD3798/f/78/fv30aNHf//+/fPnz9+/f//9+8fAwMDExMLIyPjv3z8GCPjPyEBf8P//fwYYYGRkZGBgYASD/zDAAAaMjIwMYMDIyMjAwMDIyMjAwPAfBlhYWP79+8fIyMTJycHLy8vBwc7IyPTv3z8WJiYWFmZWVlYWFhYmpv///zMgAOM/BgzA+J9hRAHG9x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ZmVgYGhn///v39+/cXDPz58+fnz59///798+fP379/////z8jIyAQGDAMKGBkZGcDgPxgwMDD8/fuXkZGRCQwYGRn/M/xjYGD4//8/CwvL37+///z58/fvXwYGBiYmJhYWFiYmJlZmRi4uLj4+Pl5eXnZ2dkZGxv9gwMbKxsDA8Pff3/9gwMjIyAQEjEx///1lGAW4ATMT87///4Dg////jGDAzMTMwMDw6/cvRjD4////z58/P3/+/OnTp2/fvv349Q8I/v79y8DAwMzMzMLCwszMzMTE9O3bNwYGBiYmJmZmZiYmJkZGxv8Q8I+RgeE/IyMjA8P///8Z/oMBAwMDIyMjAxww/meAg/+MDLQEjIyM//////v37////xkZGVnAgJmZmZWVlZmZmRUGWFhYmJiYGBgY/jP8+////z8wYAADRjBgZmb6+/ffv3//mZgYWVlZ2dnZWViYGRmZ/v36ysjIyAAG////Z2BggoB///4xjAIGBsb3Hz4xUAP8//+fYSDA////GXADRkZGBhhgZGRkYGD4/5+RgRTwl+EvAwPD////GWCAkZGRgYGBiYnp//////79+///PyMjIzMYMDExff/2i4mJiZmZmYmJiYGB4e/fv3/+/Pn79++fP39+/fr1HQz+/PnDwMDAxMTEzMz8+/dvhsEE/v//z8DAwMjIyAAG/xn+/f//n4GBgREE/jMxMTEyMjIwMPz79+/Pnz///v3j5mT/+/fvnz9//v//z8HBwcfHJyQkxMPD8+/fPyYYYACD/2DAyMjIMApwg////zOCAQMY/IMBJiamL1++vHv37tOnTz9+/GBkZGRhYWFmZv7zj4mRkZGBgYGRkfH///9///79/fv3nz9/uLm5/4MBAxj8////Hwj8Z2PlYACD////MuACjP8Z4OA/IwMtARsb218wYGBgYGFh4eDg4OTkZGVlZWFhYQIDZmZmBgaG/////wMDJub/QPDv3z8GBgZGRkZmMGBiYvr169f//wyMjAzMzMysrCwsLKwMYMD07zcjGDAwMPwHA0YQYGaAgv8MDIwMIxgwvv/wiYEa4P///wwDAf7//8+AGzAyMjLAACMjIwMDw///jAykAEYWxv9IgAEGmJiYGBgYGBkZGRgY/oPBv3///v//z8jAwsjIyMDAwMjIyMDAwMjIyAAG//79Y2JiYmRk/Pfv38+fP7+AwY8fPxgZGRkGCPz//58BBhgZGRkYGBgZGf///8+ABBiZGCCAiYnp79/f//79+///PyMjIxMYMDAw/P39kwkMGBgY/oMBAxjw8fFxcnLyggEbKxsDA8Ofv3+AgJWVlWEU4Aa/f/9mAQJmFgYGhl+/f30Gg+/fv3/69IkBDBjBgIGB4R8YMDKz/wMDBgYGJiYmZmZmJiYmRkbGv3///vv37////wwMDIxgwMDA8P//f4b/zAwI8I8RDBgYGP7//88AAYz/GZDBf0YGGgMODg5ubm4uLi52dnYGBoZ///79/fuXhYXlPxJgZGRkYGBgZGRiYv7HwMDAyMj4Hwz+/fv3HwwYGZmYmZlZWVlYWVmYmVkYGBj+gwEr4z9GMPgPBv/+/WNgYGBkZGZkZGQYBQwMjO8/fGKgJfj//z/DKMANPn78/Pv3758/f/748ePPnz////9nZGRkAgMGBgZGRsb/YPAPDP7///+PgREOGMDgPxgwMjIyIAFGRkYGBgZGRsb//xkZSAP/GKgE/v37x8DAwMLCwsXFxQcGHBwcLKyMjIwMjAwg8O8/w79///7//88ABkwgwMjIwPCfgeHfv/8QwMrEzMDA8P///39gwMDAwAQGDLgA4z8GmoL/TAw4wD8wYGBgYAIDRkZGBgaG3//+MoIBExMjIwPDfwaGf//+//v3jwEMGBkZmYCAkQEI/jMw/P/P8Of3/x8/fnwCg2/fvv3584eBgYGJiYlhgAAjI+P///8ZGBj+///PgASYmJgYGBgYGRkZwOD//////v37//8/A+N/Jhj4DwZ///799+8fCwvL//////37x8jIyMLCws7OzsHBwcrKys3NzUAKYPz7k5GRCQgYwOAfGPz//5+FhZWFhZmVlYWZmYWRkZFhFBAHGN9/+MRAS/D//3+GUYAbMDIy/////+/fv79///4JA3///v3z589fMPj37x8jIyMzMzMLCwszM/PP338YkMD///8ZGBj+///Pxsb2//9/BgaGf//+/YcBBgYGJiYWBtLAPwZqABYWln///v39+/f///9MTEzMzMysrKzMzMycXGzs7Ozc3NycnJysrKxMjAwQ8PfffwYw+P///79//xgYGBjBgOHvPyYmJmZmJkZGhv//GeDg37//DFgB4z8GmoL/TAzYABMTIwMMMDIy/P/P8PfvPyBgYGb6DwYMDAxMTEyMjIwMYMDMxMgABv/+M/z+/fv79+9fv379+fPn92+//v79+/v3779///7794+RkZGZmZmJienPnz8MAwH+/fvHwMDACANMTEwMDAyMjIw/f/5kYGBghAEGGGBhZf7379+fP3/+/v37//9/RkZGZmZmJiYmFjBggwEWFhYmJiZGMGAgAfxn+veHAQwYGRkZwOD///8MDAxsbGzMzEwsLKxMTEwMDIz///9jGAVEAMb3Hz4x0BL8//+fYRTgBoyMzIyMjExMTIyMjH/+/Pn9+/fPnz///Pnz+/fvP3/+/AKDP3/+MDAwMDIyMjEx/f3PAAeMMMDAwPD7929GMGBgYGBkZGRgYPj//z8DCDAxkAb+MVADMDIyMjAw/McArGwszMzMrKys7OzsHBwcnJycXFxcbGxsLCxMjIwMjAwM/xkY/v9n+P+fAQgYGRmYGRgYGRkg4O/f///+/fv//z8DAwMzMzMDVsD4j4Gm4D8TAzbw9+9fBgYGRkZGJiYmZmZGBjD4/5/hLwPD//8MQMDIyMDIyMDIwPCfgeH/f4Y/f/79+vXr27dv379///Hjx8+fP3///v3379/fv/4wYgAGBob///8zUAcwMjD8ZyARMDIyMjAw/P//n4GB4T8YMDExMTAw/P//nwEMGMGAgYHhP8M/CGBkZGRmZmZnZ2djY2NlZWVjY2NmZmZjY2NhYWFiYvr////fv3///fvHyMjIQApg+vf7PxgwMDAwMjIyMTExMzMzMjJycLAzMjIBAQMD4/////7//88wCogAjO8/fGKgJfj//z/DKMAN/v79z8jIyMDAwAgDDAwMjIyMf/78+f///9+/f3/9+vXz588fP378/Pnzz58/f/8zAMH///8ZwICJiYkRDH7//s3IyMjExMQIBgww8O8fA4ngHwM1wJ8/f5hggJGR8T8YMDAw/P335//////+/fv//z8zMzMbGxsnJycbGxsPDw8rKys7OzsbGxsLCxMjIwMjAwj8+fWHAQYYGRmZmJiYmRkZGBj+/v3PgBUw/mOgKfjPxIANMDMzMjAw/P37/9+/f////2eAARY2FgYGhv8MDP//M/z58+/Xr18/f/78/fv3ly9ffv369f3791+/fv39+5eRkZGJiYmRkZGZiYWBgYERDP7///8PBlhYWBgGAjAxMTHAwH8w+Pfv3////9nY2P7////v37////8zgAEjBDAxMDMzs7KysrGxsbOzs7KyMjMzMzExsbGxMTAw/Pv37//////+/fsPA8zMzAykAKZ/f/7//wcEDAwMTExMLGDAzMzMysrKyMjIwMD4//+//2DACAb///9nGAW4AeP7D58YaAn+///PMApwAxYWtn8wwMDAwMjIyMTExMjI+OfPHyYwYGRk/PPnz+/fv3/+/Pnnz58v377/+/fvz58/f2Hg////DAwMHBwc////ZwCD/2DAwMDw//9/RkZGhoEA////Z2BgYGRkZACD////MzAw/AcChn/MYMDIyPgXDP78+fP//39WMOAEAw4wYGNjY2Vl5WBlYoCBv3//AwEDGDAyMjJgBYz/GGgK/jMxYAP///9nAANGRkZmZkYGGPjx+9/v379//fr1Awy+g8FvMGBkZGRhYWEGg/////8FA0YGJkZGRgYGBkZGRgYw+P//PwMDAyMjI8NAgP///zMyMjIwMDCCAQMYMDIy/v79m4GBgREMmGGAkZGRh5ebmZmZlZWVhYWFiYmJgYHh379/////Z2Rk/P///79//xjAgAkG/v79y0ACYGT69+s/GDAyMjIzM7OwsLCysjIzMzOAACMDw38w+MfAwMgEBv/+/WMYBbgB4/sPnxhoCf7//88wCvABJgYGBkZGRgYw+I8EGJEAAwz8+vvn79+/v3///gkGv379+v379z8wYGBg+P//PwMYMMIAw39GhoEAjIyM/2GAAQYYGRkZGP8zgQEDA8P//////fv3//9/BgaGv3//MoABIyMjKysrOzs7JycnGxubAC8PCwsLOzs7CwszIyPDv38M//79+///PxMTEwNWwPiPgabgPxMDNvDv3z9GRkYmEGD4/5/hz5+/P3/+/PPnz4fPX379+vX9+/efP3/+/v37////DGDAzMzMwMDAyMjIxMTEyMjIwMDwDwwY/jP+//+fAQYYYeD///8MAwT+wwADGDAyMjIwMLCwsDAxMTEzM7OysrKBAQsLCzMzMwsrMwMS+P//PwMY/Pnzh5GRkYmJiREGGBgY/oMBA7GAkYHhP+PfnwwMjEDAxMTEzMzMAgZMTEx///5jZGRgZGT8///f//8MQMDExMTIyPj//3+GUYAbML7/8ImBluD///8MowA3+P37LyMjIxMYMDIyMjAw/AcDRkbG/2DAAAaMMMDMxvr///+/f//++fPn9+/ff8Dg379/nz9//vfv318w+P//PwMDAyMY/P/HMCDg////DGDACAYMDAyMYPCf4R8E/P37l4GBgZmZmY2NjZWV9ffv3//////79++fP3/+/fvHxMTEDAa/vn9jZ2fnAQNubm4uLi4ODjYGBoa/f/8zDCbAzMzIwMDw48evb9++ff369QsY/Pz5k42T6y8Y/Pv3j4mJiYWFhZmZmZGRkZWV9ffv379+/fr79y8DAwMzMzMTGDAyMP0HAwYGhv9gwAAGjIyMDAMBGBkZ/4MBAwMDIyMjMxgwMTHx8PAwMjKysLAwMzOzgAETExMjI+Ov3z8ZwOD///+MSOD///+MYMDAwPAfDP79+/f//38mJiYGUgDj31+MjIzMYMDCwsLMzMzExMTIyPj3719GRgZGRsb//xn+gwEjGDCMAryA8f2HTwy0BP///2cYBbgBMzPr/////4EBAwMDIxgwMTH9/fuXgYGBkZGRAQb+g8Gf//8YwYCJiYmRkZGBgeH///8MDAz//v37/fv3jx8/vn///vPnz9+/f//79+////+MDEwMAwH+///PwMDAyMjIgAT+gwETExMjIyMDA8N/MGAAg79//zIxMTEzMzMxMf2DAQYGBhZW5v9gwMDAwMzMzM7OzsHBwcbGJiMjzYANMP3/z0BL8I+RkQEbePLk6a9fv378+PHz58+/f/8yMDAwgsGf338ZGBiYYODfv39///799+8fMzMzAxgwggEDA8P//////fvHCAYMSOD///8MDAyMjIwMAwH+///PyMjIxMTEysrKzs7OycnJwcHBysr6//9/BgYGRkbG/zDw79+/////MzEzAgETExMjI+N/MPj379/////Z2Nj+/fv3////f//+MTAwMDIyMjExMTIy/vv3j4EE8J/hzy9mZmYWMGBmZmZiYmJkZGQAA0ZGBgYGRgYGhn9gwAAGTExMDKMAN2B8/+ETw0CA////MwwE+P//PwNuwMjIyAADjIyMDAwM////Z6AtYGLABv7//8+ADfxjZMAK/v37x8TExMjIyMDA8OfPn1+/fv38+fPPnz/v3334////v3///v//z8jIyMTExMzMzMTE9P///3///v39+/f///+MSICBgeH///8MDAz///9nwA0YwYCBgeH///8MNAWM/xmwgd+/f3NycvKDATc3NysrKyMjAxAw/f/PCAIM//8z/AcDBgYGRkbGP3/+MIMAEyMjAxD8+8fw//9/BhhgZGRkYmIAgv//Gf7+/ff3718WFpb///8zMDAwQgHD//8M/////8fIyMDA8P8/w+/fv79+/foRDL5//87KysqAFfxnZKAlYGRkZGBg+A8GDEiAkZGRAQkwMjIyMDAwMjIyMDD8BwMGBob///8zggEDAwMjI+P//////v37//9/BgYGJhjg4eFhYWFhZ2dnY2NjYWFhYGD4////v3//GBkZGbACxv8MVAKMYPAPDP7//8/MzMTExPz/9082NlZ2dnYmJqb/YMDIyMjExPT//z8GBkaGUUAiYHz/4RPDQID///8zDAT4//8/A27AyMjIAAOMjIwMDAz///9noC1gYsAG/v//z4AN/GP8x4ANMMIAAwPD/////8HAnz///v79++fPn59g8OvXr9+/f//794+BgYEJDJiZmZmYmP7///8XDBgZmBgYGJiYmBgZGRmwgf///zPQEzD+Z8AGWFhY/oEBIyMjKysrFxiwsbEJC/Dz2MooAAAgAElEQVQzggEDA8P///8ZGBgYwYCJiQEC/v79//fvXwYGBkZGRiYmJgYGhn///v3//5+BgYEZBBgZwODfP4b/YMDAwMDIyMjAwPAfDN5++Pjr169vYPD79+////8zgcGfP38YsIL/jAx0BIyMjAxg8P//f0ZGRgYY+Pfv3////xnAgBkMmJiY/v///+fPn9+/f//9+5eFhYWJiYmFhYWVlZUNDFhYWJhQASMjIwMDw38wYGRkZMAKGP8zUAkwgsH//////fv3//9/RkZGJiZmNqZ/LCwsrKysTExM/8CAkZGRiYnx/38GBgZGBob/DKOAFMD4/sMnhoEA////ZxgI8P//fwbcgJGRkQEGGBkZGRgY/v//z0BbwMSADfz//58BG/jH+I8BN/j//z8DAwMjCmD+////v3//fv/+/evXr59g8OfPn//////58+f3799//vxhYGBgZGRkYmJiYGBgYmRmBAMGMPgPA0xMTAwMDIyMjAwMDP9hgIGBgZGRkYGmgPE/AzbAyMj479+/v3///vv3j5GRkZmZmYWFhQkI/v/j4eEREBDg4+NjZ2djYGD48+fvv3//GBgYGMGAgYGBEQyYmRkZYODv3/8QwMDA8B8MGBgYmJiYWFiYGRgYfv789enTpw8fPnz58uUfI9O/f//+/Pnz9+/f////MzExMTMzMzEx/f//nwEr+M/IQEvw//9/BgYGRhhgYGD4//8/AwPDnz9/GBkZmZiYGBkZGcDg379/DGDw////f//+MTAwMDIyMoMBExMTGxsbCwsLKysrGxsbKysrMzMzIyMjAwMDExMTAwPDv3///oMBIyMjAwMDIyPj////GbACxv8MVAKMjIwMDAz/wYCBgYGJiYmRkYmHg4WJiYmZmfn/////wICRkZGJien/fwYGhv8Mo4BEwPj+wyeGgQD///9nGAjw//9/BtyAkZGRAQYYGRkZGBj+///PQFvAxIAN/P//nwEb+Mf4jwEH+A8DDAwMjDDw7x8DExgwMjIyMDD8g4FfYPDt27cfP378+fPnPxgwAgEDEwMqYGRkZGBg+PfvHyMjIwMDAyMjIwMDw38wYGBgYGRkZKAl+M/IgBX8+fOHiYmJhYWFiYmJgYHh79+/f/78+ffvHxcb2z8wYGJi4uDg4OfnFxQU5Obm+v37DwsLCzMzAyMjw///DH//Mvz9+/ffv38MDAxMTEzMIMDAyMjw/z/D378Mf/78YWVl+fr12/v37z9+/Pjjx49///4xgcG3X7+YmJhYWFiYmZkZGBj+/fv358+ff//+sbCwMGADjP8ZaAr+///PwMDACAYMDAz///9nYGD4//8/IyPj////GbCB////MzAwMDIysrGxcYABKysrGxsbIyMjExgwMDD8////HxgwMzP/hwEGBgZGRkYmJiZGRsZ///4xYAWM/xmoB/7//8/AwMDIyMjExMTMzMLExMjFxsTIyMTAwPD///9///4xMDAwgsH//wwMDP8ZRgGJgPH9h08MAwH+///PMBDg////DLgBIyMjAwwwMjIyMDD8//+fgbaAiQEb+P//PwM28I/xHwM2wMTExAAG////Z2Bg+P//PwMDw////xkZmRkYGBjBgIGBgZGRkQEMfv/+zQAG//////37948fP75///7z58+/f/79////HxgwMDAwgQEjI+OfP38YGBgYGRkZGBgYGRkZyAdMDKSA/4z/GLABRkbG//////v3jwEMmMCAkZHx9/fvzMzMLCwsTExM//////fv338wEBUVZWNj4+DgYGdnZ2NjY2ZmZmJiYGJiAIJ//xj+/WP4+/fvr1+/fv78+ePHj1+/fr1+/ZoRDJiYmBgZGf/9+/fnz5+/f/+ycnL+////HxgwgAETExMjI+P///8ZsAHG/0wMpIF/DOSC////MzAw/P//n4GBgYWF5R8Y/P//n4GBgQkMGBkZWVhYWFlZOcCAjY2NkZGRgYHh////TExMDNjA379/GRgYGBkZGRgYGBkZGQgCxv8MVAL/////9+8fAwMDCwsLKxgwMzMx/fvDAAb///9nAANGMPj//z8Dw38GBkaGUUAKYGEYBcMC/P37lxEJ/AcDBgYGZmbm/////wOD////MzAwMIIBExMTAwMDIyMjExMTKysrOzs7FxfXnz9/fv/6AwS/wOD3799///79/fs3AwMDCwvL////GRgY/v//z8DAwAgGDAwM////ZxgE4D8YMDAw8PPz//79++fPn79+/fr79y8LCwsbGDx58oSFhYWNjY2Dg4OLi4sbDNjY2BgYGH79+vUVDL59+/bjx49fv379+fOHl5f3169fP3/+/PPnDzMzMxsbGzs7Oysr69efP/+DAcPgAIyMjAwMDP9hgBEGfv36xcDAwMTExMLCwsrKygYGzMzM7OzsTExMzGDAxMT0////f//+MTAw/IcBBjBgZGRkYmJiZGRkYmJiBAMGMPj///+/f/8YGBgYGRkZaA8YGRmZmJhYwICZmYmJifn/398MDAz///9nYGBgZGRkAIP///8zMPxnYGBkGAUkAsb3Hz4xDAT4//8/w0CA////M+AGjIyMDDDAyMjIwMDw//9/BtoCJgZs4P///wzYwD/GfwzYwL9//xgZGRkYGBgZGRmQACMj438wYIABRkZGBgYGJiamv2Dw//9/JiYmZjBgZGT8+4fh379/v3///vXr18+fP3/9+vX79++/f/8yMTH9A4O/f/8ygAETExMjI+O/f/8YSANMDKSA/4z/GLCBv3//MjExMTMzMzExMTAw/Pv37+/fv//+/fv9/TsrKysHBwcrKysDA8O/f//+/v37798/ZmbmfzDw//9/ZmZmFjBgYGD4AwZ///5lZGRkgoG/f/8yMTExMzMzMTExMDD8/v37x48fv3//ZuXkZGJiYmZmZmJiYmBg+Pfv39+/f//9+8fMzMyADTD+Z2IgDfxjIAUwMTH9////379/DGDAzMzMBAZ///5lZmZmZWVlY2NjZ2dnY2NjYWFhZmZmYWH5+/fvHzD4//8/ExMTMzMzExMTAwPDfyTAAAaMjIzMzMwMMPD//38GBob///8z4AGM/xmoAf7//8/IyMjExMTCwsLKysrMzMzAwPD//3/m/38YGBj+///PwMDAyMjIwMDwHwyYmJgYRgHpgPH9h08MAwH+///PMBDg////DLgBIyMjAwwwMjIyMDD8//+fgbaAiQEb+P//PwM28I/xHwM2wMLC8h8M/v37xwAGjIyMDBjg////DAwM////Z2RkZGBgYGRkZGJiYmRk/P///18wYGJkZWJiYgSDf//+/QWDf//+vX379u/fv3/+/Pn79++/f/8YGBiYmJgYGRn//fvHQBpgYiAF/Gf8x4Ab/P//nwEGGBkZGRgY2JiY/v///w8GGBkZmcDg379/jIyMDGDw//9/BgYGRjBgYGD4DwYMDAyMjIwMYPD//38mJqZ/YPD//38mGGBkZPz17x8DA8P///8ZYICRkZEBN2D8z8RAGvjHQApgYmL6////v3//GBgYmJiYmJmZWVhYmJmZBQQEmJiYWFhYmJmZGRkZGRgY/v379///fwYGBkYwYICB/2DAAAaMjIwMSOD///8MYPD//38GMGBiYmIEg79//zJgBYz/GagB/v//z8TExMLCwsbGxsrKysDA8AcE/nKxMf3//58BBv7////v37////8zMzMzMDAyMPxnGAWkAMYPHz8zYAP///9nGEzg////DMMTMDFQA/z//5+BluA/GPz58+fXr18/f/788ePHz58///z5w8TEzMDAwMjIyMDA8B8JsLCw/AcDBhhgBIO/jEz/weDfv38MDAz///9nYGBgZGRkYmJiwAYY//9jGNqAiQE3+A8GDGDAyMjIwMDAzMz4HwYYwICRkZEBAzAyMjKAwb8/v1lZWdnZ2TnAgI2NjYWFhYmJ6d+/fwzUAP///2cgBfxjZCAJsDD8ZWBg+A8GDGDACAYMDAzMzMxsbGzMzMyMjIwMIMDIwPD///9/DAyMDFgAIwPDf4ZRQCJgYRgFo4AIwMzMzMDAwMzMzMrKys7OzsXF9RcM3r17/w8M/v//z8DAwMTExMzMzMTE9PPnTyYYYGBg+Pfv39+/f//9+/fr339mMGBjY2NkZPz///8/MGAYYeDfv39MTEzMzMxMTEwMDAz//v37+/fvPzBgYmJiZmZmZGRkYGD4BwNcXFx/YeD///9MTEzMzMxMTEzSkhKMjIzMYMAIBv/////79y8jIyPDkAKMjIz///9nYGD4//8/AwMDKysrMzMzIyMjAwPD////GRgY/v//x8jIyMDAyIAd/GcYBaQDxg8fvzAw/GfAAP///2cYTOD///8MwxMwMVAD/P//n4GW4P///4wwwMDA8B8GWFhYf//+/ePHj+9g8PPnz9+/f//794+BgYEJBhjA4D8YMLCw/v///9+/f////2cAAyYmJkZGxv///zNgA4z//zEMbcDEgA0wMTH9////379/////ZwADJiYmRkbG////MoIBAwPD//////379/fv3////zMyMjIxMbGwsLCxsXHCACsr69/fvxhhgIGB4T8MMFAJ/P//n4EU8I+RgSTAwvD3////DEiAkZGRgYGBk5OTCQwYGBj+/fv3//9/RkZGBgYGRkZGhlFAPcDCwPCfYRSMAkLgPxgwggEDA8N/MGBgYPj//z8rGHBzc//+/fsXGPz58+fnz59///79AwZ///5lBAMmJiYGRsb///8zMDD8//+fAQz+/fvHCAYMIxL8//+fAQz+/fvHyMjIxMT479+//2DAxMTEwsLCwcHBzMzMzs7OwsLCBgYsLCyMjIwMDAz//v378+cPIyMjExMTIxgwDDXw//9/BgaG/2DABAbMzMxMTEzMzMyMjIwMDAz///9ngAFGRkYGBkYGhv8Mo4BKgPHDx08MDIwMGOD///8Mgwn8//+fYXgCJgZqgP///zPQEjAyMjLAwP///xkYGP7//8/AwPDz5y9mZmYWFhZmZmYmJqb/////+/fv////f//+/f379w8w+Pnz558/f/79+/f///9vv34yMzOzsrIyMzMzMjL+////79+///79Y2JiYsAGGP8zDEvw588fJiYmZjBgYGD4+/fvnz9//v37x8rKysDAwMTExMLCws7OzgEGrKysTDDAwMDw////P3/+/P79++/fvzxcnAxg8B8JMDAwMDExMVAD/P//n4EU8I+RgSTA/P/P//////37x8jIyMTExMbGxsrKyszM/P//f0ZGRgYGhv9gwMDAwMTExMjI9O/fX4ZRQD3A+OHjJwYGRgYM8P//f4bBBP7//88wPAETAzXA////GWgJGBkZGbABFhaWf2Dw9+/f////M4ABIyMjCwvLfzD48+fPbxj4+/fv95+//v79+/v37z9//vz//5+RkZEJDBhGHvgHBv///2dkZGRhYWFlZWVmZmZnZ2dmZmZhYWFjY2NhYWFmZmZiYmJkZPzz58////8ZGBgYYYCJiYmRkZHh318GMPgPBgzUBv///2cgBfxjZCAJMP37zQAGTExMzMzMrGDAzMz8+/dvRjD4DwYMDAxMTEyMjIz//v1jGAXUAywMDIwMDIwMDP8ZRsEowA3+/fvHgAQYGRkZGBgYGRn//Pnz79+//2DAyMjIDAZMTEzfv39nAgN2MPgHA3/+/f/169c3MPj169e/f/+YwODfv38MIwmwsbH9+/fv79+/////Z2Vl5eDg4OTkZGNjY2VlZQIDRkZGBgaGf//+/fnz5////5ycnP+QAAMDw79//xgYGBj//2OAAUYk8O/fP4ahAP7//8/ExMTMzMzCwsLMzMzExMTAwPD3718GVPD///9///4xMjIyjAJqgv+MHz5+YWD4z4AB/v//zzCYwP///xmGJ2BioAb4//8/Ay0BExPT////GRgY/v//z4AKGBkZGcDgPxj8+/fv////rKysDAwM/8GAAQwYweDXn7/MzMxMTEz/////9evXt2/fvnz58vPnz79//zKMJMDExMTOzs7Dw8PNzc3Ozs7IyPjv37+/f/8yMjL+hwEGBgZGRkYGBgZGRsY/f/4wwQAjI+P/////gQE7K8t/JMAAA4yMjAzUAP///2cgBfxjZCAN/PnJwsLCxsbGysrKzMz8////f2DAzMzMCAb/////BwYMYMDMzMwwCqgHGD98/MLA8I+BgZGBOPD//3+GgQD///9nGJ6AiYGW4P///wyDCfxjYGTABr5+/fr79+/v37//+PHj169f////Z2BgYGRkZGJiYmBgYGJiYmRkZGBg+P///79///7//8/IyMjAwMDIyMgABv9hgJGRkQEJMDIyMjAwMDIy/v//n4EUwMjI+P//fwYGhv///zOgAkYwYACD/0iAiYmJmZmZiYnp////f//+/Q8GDDDAyMjIysrKwcHBycnJxsbGycnJQA3A+P8fw0CA////M2AD/xgZ8ANGRsb///8zMDD8//+fgYGBnZmBiYmJBQyYmJj+wwAjIyPDKKA9YGFg+M8wCkYB+eAfAymAiYGJARvg5+X5////Xz7e379//4SBP3/+/P3P8Pfv39+/f//794+BgYGJiYkFDP7+/csABv///2dgYPgPA2xsbP///2dgYPj3799/GGBgYGBiYmIgBfz9+5eBgYERBpiYmBgYGBgZGX/+/MmICpiYmBjA4N+/f3/+/Pn79+////+ZmJhYwICRiYGVlZWDg4OdnZ2VlZUFDJiYmP7+/cuAFfxnZBiOgJGRkYGB4f/////+/WMAA0ZGRgYGBhYWZiYwYGBg+I8EGBkZGUYBzQEj44ePnxgYGBmIBv///2cYCPD//3+G4QmYGGgJ/v//z0Bb8I+BNMDEgA38//+fiYmJmZmZkZHx379/v3///vXr1x8g+Pf/9+/fP8Hg9+/f//79Y4QBBlTAyMjIwMDw9+9fRjBgYGBgZGRkYGD4//8/A7mAkZGRgYHh////DAwM/8GAiYmJAQYYGRkZGBgYweDXr18MYMDIyMjCwsLOzs7BwcHGxsbA+J+VlZWNjY2VlZWRkfH//////v37//8/Ay7wn5GBFMD4/x/DQID///8zYAP/GBmwAmZm5n9g8P//fwYGBkZGRmZmZkZGRh4OVgYGBkZGRgYw+A8DzMzMDKOA9oCFgYGRgYGRgeE/wygYBQMH/oLBnz9/mMCAhYWFjY2NgYHh15+///////v3769fv37CwJ8/f/7+/fv//38GBob///8zggEDAwMjI+P///8ZGBgYYYCBgYGRkZGBgeHfv38MpAAmJiYGJPAfBpiYmP4jAQYGBkYwYGFhYWVlZWNjY2dnZ2NjYwUDZmZmRiYGCPj379/fv3///fv3//9/RkZGFhYWhpEE/v379x8GmJiYmJmZWVhYmJiYmJmZ////z8DA8B8MGBgYGMGAYRTQA/xnYWBgZGD4zzAKRsGAAg4Ojn9g8P///79//zIxMf3//5+Jienfv39MTEzs7OwcHBz//v37/fv3r1+//vz58/nz53///v39+/fPnz9///799+/ffzDg4OD4//8/Axj8BwMGBob///8zMjIykAL+/v3LyMjIwMDACANMTEyMjIy/fv1iYGBgZGRkYmJihgEmJiZeXl4WFhY2NjZmZmZGRsb///8zMDD8+/ePkQEE/v///+/fv////zMxMTGDwZ8/fxhGEvj379////8ZGBiYmJiYmZlZwICZmfn//78MDAz/wYCRkZGBgYERDP79+8cwCmgPGD98/MLA8I+BgZGBOPD//3+GgQD///9nGJ6AiYGW4P///wy0Bf8YSANMDNgAIyMjAwz8RwaMTIxIgAEG/oLBLzD4+fPnr1+//vz58+/fvz9//jAwMPz//58BDBhhgIF08B8GGMCAkZGRgYGBlZWViYmJhYWFlZWVDQxYWVmZmZlZWFgYGRkZGBj+////79+/////M4DB339/mMCAkZHx////DAwMjGDw798/BqzgPyMDKYDx/z+GgQD///9nwAb+MTJgBX///mVkZGRiYmIGAxYWFmZmZiYmJsa/v/7//88ABoxgwMDAwMjI+O/fP4ZRQHvAwsDwn2EUjAL6gX8M2MCvX78ZGRmZmJgYoYCBgeE/A8N/Jmbm/2Dw798/BjBgBAMODo5///6xs7P/QQL//v379OnTv3///oLB////GRgYGMHg////DKQARkZGBjBgBANmMGBiYuLl5WViYmKBAWYwYGRk/PnzJyMjIwMDw38wYGBgYAKD/wx/mJgYGBn/MzD8////HxAwgAEzMzMDdsDMMBwBIyMjExMTMzMzCxgwMTExMjL+//+f4f9/BjBgZGRkYGD4//8/AwPD////GUYBPQAj44ePnxgYGBmIBv///2cYCPD//3+G4QmYGGgJ/v//z0Bb8I+BGoCJien//////v37//8/AwMDIwz8/ssABIyMjAww8P//fwYGhr9//zIyMjKBASMY/P//n4GB4d+/f79///7x48f3799//vz5+/fvf//+/f//n5GRkYEU8P//f0ZGRiYmJlZWVnZ2dk5OTg4ODlZW1v///zMwMDAyMjIwMPwHg3///v3//5+RkZGJiYmZmZmRkfHfv3//wYCBgYGFlZGBgeH//////v37//8/IyMjMzMzExPTnz9/GLCC/8wMpADG//8YBgL8//+fARv4x8iAFfz//5+ZmZmFhYWVlZWJiYmRkfE/GDD//8PIyMgAA//BgIGBgYmJiWEU0B4wfvj4iYGBiYHhPwNl4P///wwDAf7//88wEOD///8M2AAjIyPD4AJMDNjA////GYYj+P//PxMTEyMjIwMDw58/f379+vXz588/f/58+vTp379/f//+/ffv3////5nAgJGR8f/////+/fsPBoyMjMxgwMTEJCAgwMzMzMrKysLCwszMzMjI+B8MGBkZGUgB////ZwADRkZGhkEA/v//z0BLwMjwh4GBgREM/v///w8M/v//z8bGxsTExAIGTExM/2GAkZGRYRQMHGBhYGBkGAWjYBiB////M4ABExMTGxsbCwvLv3//uLm5//79++fPn18w8OfPn7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");
            map.put("com_img", stringBuilder.toString());
            return map;
        }
    }

    public boolean checkDeptAuth(String deptId) { //一级部门BP检测
        String loginUserId = getLoginUserId();
        SdDept dept = (SdDept) dataCacheMap.get("dept-" + deptId);
        if (dept != null && !StringUtils.isEmpty(dept.getBpUserId()) && dept.getBpUserId().indexOf(loginUserId) >= 0) {
            return true;
        }
        return false;
    }

    public SdDept getSdDept(String deptId) {
        SdDept sdDept;
        sdDept = (SdDept)dataCacheMap.get("dept-" + deptId);
        if (Objects.isNull(sdDept)){
            sdDept = sdDeptMapper.selectById(deptId);
        }
        return sdDept;
    }

    public List<Integer> getAuthSdDeptIds() {
        String loginUserId = getLoginUserId();
        String loginUserRole = getLoginUserRole();
        PageHelper.clearPage();
        QueryWrapper<SdDept> deptQueryWrapper = new QueryWrapper<>();
        deptQueryWrapper.lambda()
                .like(checkLoginUserRole(BusiEnumDefine.USER_ROLE_BP), SdDept::getBpUserId, loginUserId);
        List<SdDept> sdDepts = sdDeptMapper.selectList(deptQueryWrapper);
        List<Integer> deptIds = sdDepts.stream().map(SdDept::getDeptId).collect(Collectors.toList());
        return deptIds;
    }


    public void switchUser(SdUser user) {
        String targetUserId = user.getUserId();
        LoginUserDTO loginUserDTO = getLoginUserDTO();
        String loginUserAccount = loginUserDTO.getAccount();

        SdAllWorker targetAllWorker = getAllWorkerDoFromLocalCache(targetUserId);
        if (targetAllWorker == null || StringUtils.isEmpty(targetAllWorker.getDomainAccount())) {
            throw new AppBusinessException("要模拟的员工[" + targetUserId + "]在all_worker不存在");
        }
        //仅测试环境开放
        if (runMode.equals(BusiEnumDefine.SYSTEM_RUN_MODE_TEST)) {
            QueryWrapper<SdAllWorker> fileWrapper = Wrappers.query();
            fileWrapper.eq("domain_account", loginUserAccount);
            //将登录人allworker记录的lock account修改为要模拟的人
            SdAllWorker currentWorker = sdAllWorkerMapper.selectOne(fileWrapper);
            if (currentWorker != null) {
                if (loginUserAccount.equals(targetAllWorker.getDomainAccount())) {
                    currentWorker.setLockFlag("-1");
                    currentWorker.setLockAccount("-1");
                    sdAllWorkerMapper.updateSdAllWorker(currentWorker);
                } else {
                    currentWorker.setLockFlag("1");
                    currentWorker.setLockAccount(targetAllWorker.getDomainAccount());
                    sdAllWorkerMapper.updateSdAllWorker(currentWorker);
                }
                dataCacheMap.put("allworker-" + currentWorker.getWorkerId(), currentWorker);
                dataCacheMap.remove(BusiEnumDefine.DOMAIN_ACCT_PREFIX + loginUserAccount);
            } else {
                throw new AppBusinessException("当前登录用户的域账号在all_worker不存在");
            }
        }
    }

    public String checkNewWorker() {
        String userId = getLoginUserId();
        TbWorker tbWorker = tbWorkerMapper.selectOne(new QueryWrapper<TbWorker>().eq("worker_id", userId));
        if (tbWorker != null) {
            return userId;
        } else {
            throw new AppBusinessException("当前员工不是新员工！");
        }
    }


    //全量更新部门权限缓存  Redis keys 不能用， 且此缓存并未找到其他地方使用。先废弃
    public void refreshDeptRedis() {
        //缓存部门
        ValueOperations<String, String> ops = redisTemplate.opsForValue();
        QueryWrapper<SdDept> deptWrapper = Wrappers.query();
        deptWrapper.ne("dept_level", 0);
        List<SdDept> sdDepts = sdDeptMapper.selectList(deptWrapper);
        Map<String, SdDept> deptMap = new HashMap<>();
        Map<String, Set<String>> authDeptMap = new HashMap<>();
        sdDepts.forEach(dept -> {
            Integer deptId = dept.getDeptId();
            deptMap.put(String.valueOf(deptId), dept);
            //bp
            String bpUserId = dept.getBpUserId();
            if (!StringUtils.isEmpty(bpUserId)) {
                for (String bpId : bpUserId.split(",")) {
                    Set<String> bpAuthSet = authDeptMap.get(bpId);
                    if (!CollectionUtils.isEmpty(bpAuthSet)) {
                        // bpAuthSet.add(dept.getDeptCodeChain().split("/")[1]);//放入一级部门
                        bpAuthSet.add(dept.getDeptId().toString());
                    } else {
                        bpAuthSet = new HashSet<>();
                        // bpAuthSet.add(dept.getDeptCodeChain().split("/")[1]);
                        bpAuthSet.add(dept.getDeptId().toString());
                        authDeptMap.put(bpId, bpAuthSet);
                    }
                }
            }
            //contactorId
            String contactorId = dept.getContactorId();
            if (!StringUtils.isEmpty(contactorId)) {
                for (String contactor : contactorId.split(",")) {
                    Set<String> contactorAuthSet = authDeptMap.get(contactor);
                    if (!CollectionUtils.isEmpty(contactorAuthSet)) {
                        // contactorAuthSet.add(dept.getDeptCodeChain().split("/")[1]);
                        contactorAuthSet.add(dept.getDeptId().toString());
                    } else {
                        contactorAuthSet = new HashSet<>();
                        // contactorAuthSet.add(dept.getDeptCodeChain().split("/")[1]);
                        contactorAuthSet.add(dept.getDeptId().toString());
                        authDeptMap.put(contactor, contactorAuthSet);
                    }
                }
            }
            //deptManagerId
            String deptManagerId = dept.getDeptManagerId();
            if (!StringUtils.isEmpty(deptManagerId)) {
                for (String deptManager : deptManagerId.split(",")) {
                    Set<String> deptManagerAuthSet = authDeptMap.get(deptManager);
                    if (!CollectionUtils.isEmpty(deptManagerAuthSet)) {
                        deptManagerAuthSet.add(dept.getDeptId().toString());
                    } else {
                        deptManagerAuthSet = new HashSet<>();
                        deptManagerAuthSet.add(dept.getDeptId().toString());
                        authDeptMap.put(deptManager, deptManagerAuthSet);
                    }
                }
            } //deptManagerId
            String offerDeptManagerId = dept.getOfferDeptManagerId();
            if (!StringUtils.isEmpty(offerDeptManagerId)) {
                for (String offerDeptManager : offerDeptManagerId.split(",")) {
                    Set<String> offerDeptManagerAuthSet = authDeptMap.get(offerDeptManager);
                    if (!CollectionUtils.isEmpty(offerDeptManagerAuthSet)) {
                        offerDeptManagerAuthSet.add(dept.getDeptId().toString());
                    } else {
                        offerDeptManagerAuthSet = new HashSet<>();
                        offerDeptManagerAuthSet.add(dept.getDeptId().toString());
                        authDeptMap.put(offerDeptManager, offerDeptManagerAuthSet);
                    }
                }
            }
        });

        Map<String, List<SdDept>> authListMap = new HashMap<>();
        authDeptMap.keySet().forEach(id -> {
            Set<String> authDeptId = authDeptMap.get(id);
            List<SdDept> deptList = new ArrayList<>();
            authDeptId.forEach(deptId -> {
                deptList.add(deptMap.get(deptId));
            });
            authListMap.put(id, deptList);
        });
        //清空缓存的部门
//        List<String> keys = RedisUtil.keys(deptRedis + "*");
//        if (!CollectionUtils.isEmpty(keys)) {
//            redisTemplate.delete(keys);
//        }
        //redis更新
        authListMap.keySet().forEach(id -> {
            List<SdDept> authDeptList = authListMap.get(id);
            String string = JSONArray.toJSONString(authDeptList);
            ops.set(deptRedis + id, string);
        });
    }

    /**
     * 删除已失效的员工
     *
     * @param allWorkerList
     */
    public void deleteCacheMap(List<SdAllWorker> allWorkerList) {
        for (SdAllWorker worker : allWorkerList) {
            dataCacheMap.remove("allworker-" + worker.getWorkerId());
            dataCacheMap.remove("domain-" + worker.getDomainAccount());
        }
    }

    public OuterAppTokenDTO getOuterAppToken(String outerAppKey, String outerAppPwd) throws BusinessException {
        // 非空校验
        if (StringUtils.isEmpty(outerAppKey) || StringUtils.isEmpty(outerAppPwd)) {
            throw new AppBusinessException("传入参数为空");
        }

        if (!(outerAppName.contains(outerAppKey) && outerAppPasswd.contains(outerAppPwd))) {
            throw new AppBusinessException("外部应用名称或密码错误");
        }

        try {
            outerAppKey = outerAppKey.toLowerCase();
            String token = PmJwtUtil.generateTokenExpire(outerAppKey, pmPrivatekey, keyTtl, new HashMap<>());
            OuterAppTokenDTO outerAppToken = new OuterAppTokenDTO();
            outerAppToken.setToken(token);
            redisTemplate.opsForValue().set(token, "", 15, TimeUnit.MINUTES);
            return outerAppToken;
        } catch (Exception e) {
            e.printStackTrace();
            throw new AppBusinessException("获取token异常");
        }

    }

    /**
     * 查询域账号list
     *
     * @param workerIds 工号
     * @return
     */
    public List<String> getAccountByWorkerId(String workerIds) {
        return Stream.of(workerIds.split(","))
                .map(this::getAdminAccount)
                .filter(StringUtils::hasText)
                .collect(Collectors.toList());
    }

    public String getAdminAccount(String workerId) {
        SdAllWorker allWorker = (SdAllWorker) dataCacheMap.get("domain-" + workerId);
        if (allWorker == null) {
            return "";
        }
        return allWorker.getDomainAccount();
    }

    public List<SdUserRoleDTO> getSdUserRoleList(){
        List<SdUserRoleDTO> userRoleList = sdUserMapper.queryAllUserRole();
        // 遍历更改
        for (SdUserRoleDTO sdUserRoleDTO : userRoleList) {
            if (!StringUtils.isEmpty(sdUserRoleDTO.getRole())) {
               StringBuffer buffer = new StringBuffer();
                String[] roleCodes = sdUserRoleDTO.getRole().split(",");
                for (String code : roleCodes) {
                    buffer.append(UserRoleEnum.getNameByCode(Short.valueOf(code)) + " ");
                }
                sdUserRoleDTO.setRole(buffer.toString());
            }
        }
        return userRoleList.stream().filter(t -> !StringUtils.isEmpty(t.getRole())).collect(Collectors.toList());
    }

    public List<SdUserRoleDTO> getSdUserRoleList(String bearerToken) {
        if (StringUtils.isEmpty(bearerToken)) {
            throw new AppBusinessException("传入token为空");
        }
        bearerToken = bearerToken.substring(7);

        if (!redisTemplate.hasKey(bearerToken)) {
            throw new AppBusinessException("token验证失败");
        }

        List<SdUserRoleDTO> userRoleList = sdUserMapper.queryAllUserRole();
        // 遍历更改
        for (SdUserRoleDTO sdUserRoleDTO : userRoleList) {
            if (!StringUtils.isEmpty(sdUserRoleDTO.getRole())) {
                sdUserRoleDTO.setRole(UserRoleEnum.getNameByCode(Short.valueOf(sdUserRoleDTO.getRole())));
            }
        }

        return userRoleList.stream().filter(t -> !StringUtils.isEmpty(t.getRole())).collect(Collectors.toList());
    }

    public void getMobileValidCodeByPhone(String phoneNum) throws BusinessException {
        if (!ReUtils.judgeIsMobilePhone(phoneNum)) {
            throw new AppBusinessException("请输入正确的手机号");
        }
        TbOfferWorker offerWorker = SpringUtil.getBean(ITbOfferWorkerService.class).getOneByPhoneNo(phoneNum);
        if (Objects.isNull(offerWorker)) {
            throw new AppBusinessException("该手机号尚未被注册为新员工");
        }
        Long times = redisTemplate.getExpire(BusiEnumDefine.REDIS_AUTH_CODE_PREFIX + phoneNum);

        if (times > 60 * 4) {
            throw new AppBusinessException("距离您上次发送验证码不足60秒，请稍后再尝试获取");
        }

        SdNoticeRecord emailRecord = new SdNoticeRecord();
        emailRecord.setApplyUserId(offerWorker.getWorkerId());
        emailRecord.setNoticeType(BusiEnumDefine.NOTICE_TYPE_SMS);
        emailRecord.setTargetPhone(phoneNum);
        emailRecord.setNoticeTitle("手机验证码用户登录验证");
        String mobileValidCode = CommonUtil.getSixRandom();
        emailRecord.setNoticeContent("您正在使用新员工入职系统短信验证，验证码" + mobileValidCode + "（有效期5分钟），请勿泄露给他人，如非本人操作请忽略。");
        emailRecord.setCreateTime(new Date());
        emailRecord.setNoticeId(IdWorker.nextId() + "");
        RedisUtil.setEx(BusiEnumDefine.REDIS_AUTH_CODE_PREFIX + phoneNum, mobileValidCode, 300, TimeUnit.SECONDS);
        sendMessage(emailRecord);

    }

    /**
     * 手机号验证码登录
     *
     * @param phoneNo 手机号
     * @param code    验证码
     */
    public Map<String, Object> getTokenByMobile(String phoneNo, String code) throws Exception {
        String realCode = RedisUtil.get(BusiEnumDefine.REDIS_AUTH_CODE_PREFIX + phoneNo);
        if (StringUtils.hasText(realCode)) {
            if (realCode.equals(code)) {
                //验证码通过
                TbOfferWorker offerWorker = SpringUtil.getBean(ITbOfferWorkerService.class).getOneByPhoneNo(phoneNo);
                return generateToken(offerWorker);
            }
            throw new AppBusinessException("验证码不正确，请重新输入");
        }
        throw new AppBusinessException("验证码已过期，请重新获取");

    }

    /**
     * 账号密码登录
     *
     * @param certNo
     * @param password
     * @return
     */
    public Map<String, Object> getTokenByCertNo(String certNo, String password) throws Exception {
        TbOfferWorker offerWorker = SpringUtil.getBean(ITbOfferWorkerService.class).getOneByCertNo(certNo);
        if (Objects.isNull(offerWorker)) {
            throw new AppBusinessException("账号错误");
        }
        Boolean match;
        try {
            match = EncryptionUtil.match(EncryptionUtil.getDecryptDataAES(password), offerWorker.getPreparationPassword());
        } catch (Exception e) {
            throw new AppBusinessException("密码错误");
        }
        if (match) {
            return generateToken(offerWorker);
        }
        throw new AppBusinessException("密码错误");
    }


    /**
     * 预备员工生成token
     *
     * @param offerWorker 预备员工信息
     * @return
     * @throws Exception
     */
    private Map<String, Object> generateToken(TbOfferWorker offerWorker) throws Exception {
        if (StringUtils.hasText(offerWorker.getDataSource()) && offerWorker.getDataSource().equals("BPM")) {
            Boolean success = SpringUtil.getBean(ISapSyncService.class).getIfThroughInvestigation(offerWorker.getWorkerId());
            if (Objects.isNull(success) || !success) {
                throw new AppBusinessException("未找到录用编号或背调未完成，请与您的招聘BP联系确认！");
            }
        }
        //验证码通过
        HashMap<String, Object> temp = new HashMap<>(1);
        temp.put("reserveStaff", true);
        String token = PmJwtUtil.generateTokenExpire(offerWorker.getWorkerId(), pmPrivatekey, keyTtl, temp);
        Map<String, Object> param = new HashMap<>(2);
        param.put("account", offerWorker.getWorkerId());
        param.put("isReserveStaff", true);
        String ptResult = abilityClient.getPtabilityTokenByAccount(JSONUtil.toJsonStr(param));
        Map<String, Object> map = new HashMap<>();
        if (StringUtils.hasText(ptResult) && JSONUtil.parseObj(ptResult).getBool("flag")) {
            map.put("ptToken", JSONUtil.parseObj(ptResult).getJSONObject("data").getStr("token"));
        }
        TbOfferWorkerVO offerWorkerVO = TbOfferWorkerMapstruct.INSTANCE.entity2VO(offerWorker);
        TbOfferAttachment avatarAttachment = SpringUtil.getBean(ITbOfferAttachmentService.class).getOne(new QueryWrapper<TbOfferAttachment>().lambda()
                .eq(TbOfferAttachment::getFileType, TbOfferAttachment.WORK_CARD_PHOTO)
                .eq(TbOfferAttachment::getWorkerId, offerWorkerVO.getWorkerId())
        );
        if (Objects.nonNull(avatarAttachment)) {
            offerWorkerVO.setAvatar(avatarAttachment.getFileId());
            offerWorkerVO.setAvatarStatus(avatarAttachment.getApprovalStatus());
            offerWorkerVO.setRejectReason(avatarAttachment.getRejectReason());
        }
        map.put("token", token);
        map.put("info", offerWorkerVO);
        if (offerWorker.getFillStage().equals(OfferWorkerFillStageEnum.NO_FILL)) {
            SpringUtil.getBean(ITbOfferWorkerService.class).updateById(offerWorker.setFillStage(OfferWorkerFillStageEnum.UN_CONFIRM));
        }
        return map;
    }

    /**
     * 删除重复数据
     */
    public void deleteRepeatData(){
        //第一步：查询hrss Offer_EmployeeInfo,Offer_SocialSecurityAddress,进行去重
        List<String> employeeOfferIds = offerEmployeeinfoMapper.queryRepeatEmployeeOfferIds();
        employeeOfferIds.forEach(offerId -> {
            offerEmployeeinfoMapper.deleteRepeatEmployeeRecords(offerId);
        });

        List<String> socialAddressOfferIds = offerSocialsecurityaddressMapper.queryRepeatSocialSecurityAddress();
        socialAddressOfferIds.forEach(offerId -> {
            offerSocialsecurityaddressMapper.deleteRepeatSocialSecurityAddress(offerId);
        });
        //对 Offer_Send_Detail 去重
        List<OfferSendDetail> offerSendDetailList = offerSendDetailMapper.queryList();
        Map<String, List<OfferSendDetail>> map = new HashMap<>();
        for (OfferSendDetail offerSendDetail : offerSendDetailList) {
            if (!map.containsKey(offerSendDetail.getHcNo())){
                List<OfferSendDetail> detailList = new ArrayList<>();
                detailList.add(offerSendDetail);
                map.put(offerSendDetail.getHcNo(), detailList);
            }else{
                List<OfferSendDetail> offerSendDetails = map.get(offerSendDetail.getHcNo());
                offerSendDetails.add(offerSendDetail);
                map.put(offerSendDetail.getHcNo(), offerSendDetails);
            }
        }
        //遍历map
        Map<String, OfferSendDetail> detailMap = new HashMap<>();
        Iterator<String> iterator = map.keySet().iterator();
        while(iterator.hasNext()){
            String HC_NO = iterator.next();
            List<OfferSendDetail> offerSendDetails = map.get(HC_NO); //每个HC_NO对应的list集合
            List<String> stateList = offerSendDetails.stream().map(OfferSendDetail::getState).collect(Collectors.toList()); //每个HC_NO对应的state集合
            List<String> states = stateList.stream().distinct().sorted().collect(Collectors.toList());
            if (states.size() == 1){
                detailMap.put(HC_NO, offerSendDetails.get(0));
            }
            if (states.size() == 2){
                String state = states.get(1);
                for (OfferSendDetail offerSendDetail : offerSendDetails) {
                    if (offerSendDetail.getState().equals(state)){
                        if (!detailMap.containsKey(HC_NO)){
                            detailMap.put(HC_NO, offerSendDetail);
                        }
                    }
                }
            }
            if (states.size() > 2){
                if (states.contains("4")){
                    for (OfferSendDetail offerSendDetail : offerSendDetails) {
                        if (offerSendDetail.getState().equals("4")){
                            if (!detailMap.containsKey(HC_NO)){
                                detailMap.put(HC_NO, offerSendDetail);
                            }
                        }
                    }
                }else if (states.contains("99")){
                    for (OfferSendDetail offerSendDetail : offerSendDetails) {
                        if (offerSendDetail.getState().equals("99")){
                            if (!detailMap.containsKey(HC_NO)){
                                detailMap.put(HC_NO, offerSendDetail);
                            }
                        }
                    }
                }else if (states.contains("2")){
                    for (OfferSendDetail offerSendDetail : offerSendDetails) {
                        if (offerSendDetail.getState().equals("2")){
                            if (!detailMap.containsKey(HC_NO)){
                                detailMap.put(HC_NO, offerSendDetail);
                            }
                        }
                    }
                }else if (states.contains("3")){
                    for (OfferSendDetail offerSendDetail : offerSendDetails) {
                        if (offerSendDetail.getState().equals("3")){
                            if (!detailMap.containsKey(HC_NO)){
                                detailMap.put(HC_NO, offerSendDetail);
                            }
                        }
                    }
                }else if (states.contains("1")){
                    for (OfferSendDetail offerSendDetail : offerSendDetails) {
                        if (offerSendDetail.getState().equals("1")){
                            if (!detailMap.containsKey(HC_NO)){
                                detailMap.put(HC_NO, offerSendDetail);
                            }
                        }
                    }
                }else{
                    detailMap.put(HC_NO, offerSendDetails.get(0));
                }
            }
        }
        List<OfferSendDetail> sendDetails = new ArrayList<>(detailMap.values());
        //需要保留的id集合
        List<String> idList = sendDetails.stream().map(OfferSendDetail::getId).collect(Collectors.toList());
        //Offer_Send_Detail 所有的id集合
        List<String> sendDetailIds = offerSendDetailList.stream().map(OfferSendDetail::getId).collect(Collectors.toList());
        //删除重复数据
        for (String id : CollectionUtil.disjunction(idList, sendDetailIds)) {
            offerSendDetailMapper.deleteById(id);
        }
    }

    /**
     * 同步HRSS入职数据到Nem
     */
    public void hrssDataTransToNem(Integer num) {
        //第二步：插入HRSS的员工基本信息数据
//        List<OfferEmployeeinfo> offerEmployeeinfoList = offerEmployeeinfoMapper.queryList();
//        Map<String, String> strMap = new HashMap();
//        for (OfferEmployeeinfo offerEmployeeinfo : offerEmployeeinfoList) {
//            List<String> strList = StrUtil.toStrList(offerEmployeeinfo.getForeignresidencycountrycode());
//            String str = JSONObject.toJSONString(strList);
//            strMap.put(offerEmployeeinfo.getOfferid(), str);
//        }
        if (num == 1){
//            String str = "[]";
//            tbOfferWorkerMapper.initWorkerRecordFromHrss(str);
//        第三步：更新员工的登录密码
            QueryWrapper<TbOfferWorker> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(TbOfferWorker::getUpdatorInfo, "hrssinit");
            List<TbOfferWorker> tbOfferWorkers = tbOfferWorkerMapper.selectList(queryWrapper);
            tbOfferWorkers.forEach(worker -> {
                String preparationPassword = worker.getPreparationPassword();
                worker.setPreparationPassword(EncryptionUtil.encode(preparationPassword));
                tbOfferWorkerMapper.updateById(worker);
//                offerIdPreWorkerIdMap.put(worker.getOfferId(),worker.getWorkerId());

            });
        }

        if (num == 2){
            //第四步：学历信息
            //插入学历信息
            //tbOfferStudyMapper.initStudyRecordFromHrss();

            //第五步：HRSS上传的附件文件（图片）转入新员工系统； 对HRSS附件类型为学历文件时，需要取最高学历对应的附件应该写入tb_offer_study的 education_file_id、degree_file_id
            //education_file_name 、degree_file_name；HRSS的学历附件可能有多个，且不区分学历照片和学位照片，我们最多取两个，随便放到学历学位对应照片字段就可以；
            List<OfferAttachmentfiles> offerAttachmentfiles = offerAttachmentfilesMapper.queryValidHrssAttachFiles();
            //获取附件类型为学历文件且为最高学历的集合
            List<OfferAttachmentfiles> offerAttachmentfilesList = offerAttachmentfilesMapper.queryStudyAttachmentFiles();

            HashMap<String,String> offerIdPreWorkerIdMap = new HashMap<>();
            QueryWrapper<TbOfferWorker> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(TbOfferWorker::getUpdatorInfo, "hrssinit");
            List<TbOfferWorker> tbOfferWorkers = tbOfferWorkerMapper.selectList(queryWrapper);
            tbOfferWorkers.forEach(worker -> {
                offerIdPreWorkerIdMap.put(worker.getOfferId(),worker.getWorkerId());
            });

            Map<String ,List<OfferAttachmentfiles>> attachMap = new HashMap<>();
            for (OfferAttachmentfiles attachmentfiles : offerAttachmentfilesList) {
                String offerid = attachmentfiles.getOfferid();
                List<OfferAttachmentfiles> offerAttachmentfilesList1 = attachMap.get(offerid);
                if(offerAttachmentfilesList1 == null || offerAttachmentfilesList1.size()==0){
                    offerAttachmentfilesList1 = new ArrayList<>();
                }
                offerAttachmentfilesList1.add(attachmentfiles);
                attachMap.put(offerid,offerAttachmentfilesList1 );
            }
            int taskId = 0;
            for (OfferAttachmentfiles file : offerAttachmentfiles) {
                taskId = taskId+1;
                handleAttachmentWhenSyncHrssHisData(offerAttachmentfilesList, offerIdPreWorkerIdMap, file,attachMap,taskId);
            }
        }

        if (num == 3){
            //第六步：语言信息
            tbOfferLanguageMapper.initLanguageRecordFromHrss();
            //第七步：家庭成员
            tbOfferFamilyMapper.initFamilyRecordFromHrss();
            //第八步：紧急联系人
            tbOfferContactorMapper.initContactorRecordFromHrss();
            //第九步：工作经历
            tbWorkerExperienceMapper.initExperienceRecordFromHrss();
            //第十步：专利信息
            tbOfferPatentMapper.initPatentRecordFromHrss();
            //第五步：成果信息
            tbOfferArchieveMapper.initArchieveRecordFromHrss();
        }
    }

    public void handleAttachmentWhenSyncHrssHisData(List<OfferAttachmentfiles> offerAttachmentfilesList,
                                                    HashMap<String, String> offerIdPreWorkerIdMap,
                                                    OfferAttachmentfiles file,
                                                    Map<String ,List<OfferAttachmentfiles>> attachMap,
                                                    int taskId) {
        Thread syncAttachmentThread = new Thread(()->{
            String offerid = file.getOfferid();
            String fileUrl = file.getUrl();
            if (StringUtils.isEmpty(fileUrl)){
                System.out.println("---------------0---finish taskid="+taskId);
                return;
            }
            int index = fileUrl.indexOf("/");
            index = fileUrl.indexOf("/", index + 1);
            String fileURL = fileUrl.substring(index);
            String hrssFileType = file.getType();
            if(!StringUtils.isEmpty(offerid)
                    && !StringUtils.isEmpty(fileUrl)
                    && !StringUtils.isEmpty(hrssFileType)){
                String preWorkerId;
                if (offerIdPreWorkerIdMap.get(offerid) == null){
                    System.out.println("---------------1---finish taskid="+taskId);
                    return;
                }else{
                    preWorkerId = offerIdPreWorkerIdMap.get(offerid);
                }
                long start1= System.currentTimeMillis();
                TbOfferAttachment tbOfferAttachment = beiSenService.saveAndReturnAttachment(preWorkerId, hrssFilePrefixUrl + fileURL, hrssFileTypeToNemFileType(hrssFileType), false);
                System.out.println("------------save file cost="+( System.currentTimeMillis()-start1));
                if (StringUtils.isEmpty(tbOfferAttachment.getWorkerId())){
                    System.out.println("---------------2---finish taskid="+taskId);
                    return;
                }
                if(attachMap.get(offerid) ==null || attachMap.get(offerid).size()==0 ){
                    System.out.println("---------------3---finish taskid="+taskId);
                    return ;
                }
                for (OfferAttachmentfiles attachmentfiles : attachMap.get(offerid)) {
                    if (CommonUtil.null2Empty(attachmentfiles.getUrl()).equals(fileUrl)
                            && CommonUtil.null2Empty(attachmentfiles.getType()).equals(hrssFileType)
                            && CommonUtil.null2Empty(attachmentfiles.getIshighest()).equals(CommonUtil.null2Empty(file.getIshighest()))){
                        TbOfferStudy tbOfferStudy = tbOfferStudyMapper.selectOne(new QueryWrapper<TbOfferStudy>().eq("offer_id", offerid).eq("is_highest_education", 1).last("limit 1"));
                        if (StringUtils.isEmpty(tbOfferStudy.getEducationFileId())){
                            tbOfferStudy.setEducationFileId(tbOfferAttachment.getFileId());
                            tbOfferStudy.setEducationFileName(tbOfferAttachment.getFileName());
                            tbOfferStudy.setEducationFilePath(fileUrl);
                            tbOfferStudyMapper.initEducationRecordFromHrss(tbOfferStudy);
                        }else {
                            tbOfferStudy.setDegreeFileId(tbOfferAttachment.getFileId());
                            tbOfferStudy.setDegreeFileName(tbOfferAttachment.getFileName());
                            tbOfferStudy.setDegreeFilePath(fileUrl);
                            tbOfferStudyMapper.initDegreeRecordFromHrss(tbOfferStudy);
                        }
                    }
                }
                System.out.println("---------------4---finish taskid="+taskId);
            }
        });
        System.out.println("-------------syncAttachmentThread subimit to pool");
        threadPoolService.submitTask(syncAttachmentThread);

    }

    public List getUser() {
        List list = new ArrayList();
        try {
            JCoFunction function = null;
            JCoDestination destination = null;
            rfcManager.connect();//获取SAP客户端
            destination = rfcManager.getDestination();
            function = rfcManager.getFunction(destination, "ZFM_EHR_GET_ZHRTXZKD");//调用SAP接口
            JCoParameterList tableParameterList = function.getTableParameterList();//获取表格参数
//            JCoTable inputTable = tableParameterList.getTable("T_INPUT");  //获取输入表T_INPUT的数据参数
//            for(int i=0;i<projectCodeList.size();i++){
//                //往输入表中，给指定字段参数进行赋值
//                inputTable.appendRow();
//                inputTable.setRow(i);
//                inputTable.setValue("PROJT", projectCodeList.get(i));
//            }
            function.execute(destination);
            JCoTable outputTable = tableParameterList.getTable("ET_DATA");//获取输出表T_OUTPUT的数据
            for (int i = 0; i < outputTable.getNumRows(); i++) {
                outputTable.setRow(i);
                list.add(outputTable.getString("ZHRBL"));
            }
        } catch (Exception e) {

            e.printStackTrace();
        }
        return list;

//        JCoFunction function = RfcManager2.getFunction("ZFM_EHR_GET_ZHRTXZKD");
//
//        RfcManager2.execute(function);
//        JCoParameterList outputParam = function.getTableParameterList();
//        JCoTable bt = outputParam.getTable("ET_DATA");
//
//        for (int i = 0; i < bt.getNumRows(); i++) {
//            bt.setRow(i);
//            System.out.println(bt.getString("ZHRBL"));
//        }
    }


    /**
     * 0 - 头像
     * 1-体检报告
     * 3-离职证明
     * 2-学历学位证书
     *
     * @param hrssFileType
     * @return
     */
    public Integer hrssFileTypeToNemFileType(String hrssFileType) {
        if (hrssFileType.equals("0")) {
            return TbOfferAttachment.WORK_CARD_PHOTO;
        } else if (hrssFileType.equals("1")) {
            return TbOfferAttachment.MEDICAL_REPORT;
        } else if (hrssFileType.equals("2")) {
            return TbOfferAttachment.ACADEMIC;
        } else if (hrssFileType.equals("3")) {
            return TbOfferAttachment.RESIGN_CERT;
        }
        return null;
    }
}